मैं एक और pojo में संग्रह में एक pojo जोड़ने की कोशिश कर रहा हूँ। मुझे यकीन है कि मैं लाइनों के साथ कहीं भी वास्तव में बेवकूफ गलती कर रहा हूं लेकिन मुझे पता नहीं लगा कि इसे कैसे हल किया जाए।दो खुले सत्रों के साथ संग्रह को जोड़ने का अवैध प्रयास
मैं एक POJO LookupTable जो स्तंभ के की एक सूची है है:
public class LookupTable {
private long id;
// More properties go here...
private List<Column> columns;
public void addColumn(Column column) {
this.columns.add(column);
}
// More methods go here...
}
मेरी हाइबरनेट विन्यास में मेरे पास है:
<class name="LookupTable" table="ARR_LOOKUP_TABLE">
<id name="id" column="ID">
<generator class="native"/>
</id>
<!-- Some properties here -->
<bag name="columns" cascade="all,delete-orphan" access="field">
<key column="LOOKUP_TABLE" not-null="true"/>
<one-to-many class="Column"/>
</bag>
</class>
<class name="Column" table="ARR_LOOKUP_COLUMN">
<id name="id" column="ID">
<generator class="native"/>
</id>
<!-- Some properties here -->
</class>
मेरी स्प्रिंग कॉन्फ़िग फ़ाइल में मेरे पास है:
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="managers" expression="execution(public * com.foo.*Manager.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="managers"/>
</aop:config>
और अंत में कोड जहां यह सब मेरे प्रबंधक वर्ग (com.foo.LookupTableManager) में विफल रहता है:
public void addColumnToTable(Column column, long tableId) {
LookupTable lookupTable = this.lookupTableDao.findById(tableId);
lookupTable.addColumn(column);
this.lookupTableDao.saveOrUpdate(lookupTable);
}
यहाँ चर lookupTableDao एक सरल डीएओ वर्ग जो HibernateDaoSupport फैली को दर्शाता है।
त्रुटि मैं मिलता है:
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
at com.foo.AbstractDao.saveOrUpdate(AbstractDao.java:29)
at com.foo.LookupTableManager.addColumnToTable(LookupTableManager.java:338)
... etc ...
ठीक है, मैं मूल संदेश मैं हो रही है समझते हैं। लेकिन मुझे समझ में नहीं आता कि मुझे दूसरा सत्र कहाँ मिलता है .... क्या कोई मेरी मदद कर सकता है?
मैं हाइबरनेट 3.2.6.ga उपयोग कर रहा हूँ, स्प्रिंग 2.5.5 और बिलाव 6.0
[संपादित करें, टिप्पणी करने के लिए जवाब में ले जाया]: मैं org.springframework.orm.hibernate.support.HibernateDaoSupport की विधि getSession() के माध्यम से सत्र हो रही है। यह वर्तमान लेनदेन से सत्र वापस कर देना चाहिए ... कॉलम ऑब्जेक्ट नव निर्मित है। –