gpt4 book ai didi

java - 非法尝试将集合与两个打开的 session 相关联

转载 作者:IT老高 更新时间:2023-10-28 13:46:33 26 4
gpt4 key购买 nike

我正在尝试将 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...
}

在我的 hibernate 配置中,我有:

<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>

在我的 Spring 配置文件中,我有:

<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是指一个简单的DAO类,它扩展了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 ...

好的,我了解我收到的基本信息。但我不明白我在哪里获得第二次 session ......有人可以帮我解决这个问题吗?

我正在使用 Hibernate 3.2.6.ga、Spring 2.5.5 和 Tomcat 6.0

最佳答案

原来我根本没有交易。我在其他配置文件之一中使用了几乎相同的事务配置。

那边的切入点也叫做“managers”,所以我的顾问在这里引用了另一个文件中的切入点。

重命名切入点解决了我的问题。

关于java - 非法尝试将集合与两个打开的 session 相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/221079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com