Ich versuche, einer Sammlung in einem anderen Pojo ein Pojo hinzuzufügen. Ich bin mir sicher, dass ich irgendwo entlang der Linien einen wirklich dummen Fehler mache, aber ich kann nicht herausfinden, wie ich es lösen soll.Illegaler Versuch, eine Sammlung mit zwei offenen Sitzungen zu verknüpfen
Ich habe eine pojo LookupTable die eine Liste der Spalte enthält:
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...
}
In meinem Hibernate Konfiguration Ich habe:
<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>
In meinem Frühling Configakte ich habe:
<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>
Und schließlich der Code, wo alles in meiner Manager-Klasse (com.foo.LookupTableManager) fehlschlägt:
public void addColumnToTable(Column column, long tableId) {
LookupTable lookupTable = this.lookupTableDao.findById(tableId);
lookupTable.addColumn(column);
this.lookupTableDao.saveOrUpdate(lookupTable);
}
Die Variable lookupTableDao bezieht sich hier auf eine einfache DAO-Klasse, die HibernateDaoSupport erweitert.
Der Fehler, den ich bekommen ist:
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 ...
OK, ich verstehe die grundlegende Botschaft, die ich bin immer. Aber was ich nicht verstehe ist, wo ich die zweite Sitzung bekomme ... Kann mir jemand dabei helfen?
ich Hibernate 3.2.6.ga bin mit, Frühling 2.5.5 und Tomcat 6.0
[Bearbeiten, bewegt Antwort auf einen Kommentar]: Ich bin die Sitzung über die getSession() -Methode von org.springframework.orm.hibernate.support.HibernateDaoSupport bekommen. Das sollte die Sitzung von der aktuellen Transaktion zurückgeben ... Das Column-Objekt wird neu erstellt. –