使用 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/