gpt4 book ai didi

不相关集合的 hibernate 映射问题

转载 作者:行者123 更新时间:2023-12-01 07:22:07 26 4
gpt4 key购买 nike

欢迎,

我在 Hibernate 映射方面遇到了一些问题。

数据库结构:

TableA
-ID_A --PK

TableB
-ID_B --PK
-ID_A -- FK -> TableA

TableC
-ID_C -- PK
-ID_A -- FK -> TableA

POJO 结构:
class TableA extends Pojo {

/*Some Fields*/

}

class TableB extends Pojo {

TableA tableA;

/*Some properties*/

}

class TableC extends Pojo {

TableA tableA;

Collection<tableB> tableBs;

}

我想要的是 TableC Pojo 映射中 TableB 元素的集合,映射键是 tableA。

这个集合应该是只读的。

映射应该是 hbm 而不是注释。

我可能已经为每一种可能的方式做到了这一点......我得到的关闭是当我对一个 TableC 对象进行操作时,一切都是正确的,但是如果我加载它们的集合,那么只有最后一个具有正确的集合集。

更新:案例描述。

用例一:加载TableC的单个对象
Session session = (Session) getHibernateTemplate().getSessionFactory().openSession();
SQLQuery sqlQuery = session.createSQLQuery("SELECT c.* FROM TableC c WHERE c.ID_C = 1"); //Oracle
sqlQuery.addEntity("c", TableC.class);
return sqlQuery.list(); //Return list with sigle object of TableC

在这种情况下,一切正常。该对象加载了 TableB 对象列表中的所有数据和适当的项目。
在这个对象上我们可以操作,改变它并更新数据库中的修改。

用例 2 加载对象集合
Session session = (Session) getHibernateTemplate().getSessionFactory().openSession();
SQLQuery sqlQuery = session.createSQLQuery("SELECT c.* FROM TableC c WHERE c.ID_C in (1,2)"); //Oracle
sqlQuery.addEntity("c", TableC.class);
return sqlQuery.list(); // throws "collection is not associated with any session"

在这种情况下,Hibernate 在检索下一个对象时抛出异常。

*代码只是示例, session 毕竟已关闭。

最佳答案

经过一番研究,问题出在Hibernate中,它被称为bug #HHH-2862

It is basically caused by having an eager collection where the key of the collection is not unique in the results.



当 Hibernate 使用 'persistenceContext.addUninitializedCollection()' 初始化集合时,这将检测到具有给定键的集合已被添加,然后将旧实例设置为 null 并将当前实例设置为集合。但是,该集合已通过较早的调用添加到持久性上下文中,并且当 StatefulPersistenceContext.initializeNonLazyCollections() 时遍历持久上下文中的所有集合调用 forceInitialization()在引用上命中了空引用,它抛出“集合与任何 session 无关”异常”。这解释了为什么在我的情况下只有最后一个对象有引用,只有一个对象一切正常,以及你对延迟初始化问题。

一些想法如何绕过这个错误?

关于不相关集合的 hibernate 映射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3451835/

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