java - HIbernate:找到同一集合的两个表示

标签 java hibernate jpa

使用 Hibernate-EntityManager 4.3.5 我收到 HibernateException: 找到同一集合的两个表示。

场景是我有 2 个实体 A 和 B;两者都与第三个实体 C 有关系。A 也与 B 有关系。让我们试着说清楚:

A -> 与 B 和 C 的一对一

B -> OneToMany 与 C

A 和 B 加载到不同的事务(拦截器)中,但接下来我创建 A.setXXX(B) 并执行entityManager.merge(A); -- A 有一个 C 的实例,B 有另一个实例,但它们代表相同的实例(相同的 ID 或主键)。 因此,我收到此错误 - 事实上,我有 2 个不同的 C 实例(一个带有 A,另一个带有 B),它们代表相同的实体(相同的 PK)。怎么解决这个问题呢?我想做一些类似 B.setXXX(a.getXXX()) 的事情,但听起来很困惑。有什么建议吗?

最佳答案

感谢@Tobb和@Mihir,我可以弄清楚发生了什么 - 当我调用entityManager.merge(A)时,我遇到以下情况:

A指向B和C; B 指向 C 的 List; C 指向 B 的另一个实例,而 B 又指向 C 的 List;

但是,B 的两个实例代表相同的对象(相同的 db PK)。这同样适用于 C 的列表,因此公平地获取消息两个表示相同的集合我必须删除关系 B -> C 中的cascade=All,这样合并就不会横贯该集合的这个分支图表。

关于java - HIbernate:找到同一集合的两个表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30699088/

相关文章:

hibernate - Grails在命名查询中使用继承的属性

java - JPA ids auto_increment 生成

java - 检查 JPQL 查询中集合的 NULL?

Java安全管理器: how to specify "No Permission"?

java - Aws Json 异常 - JSONObject 文本必须以 '{' 开头(位于 1 [字符 2 第 1 行])

java - PHP - MySQL - Java - 确保字符集统一

java - 在Android屏幕方向更改上重绘SQL中的多段线

java - 转换线索 : failed to lazily initialize a collection of role: could not initialize proxy - no Session 时发生错误

hibernate - Hibernate 事件监听器如何使用 HQL(命名查询)进行操作?

java - JPQL:SELECT NEW 查询中的枚举文字