2015-06-07 29 views
0

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

该场景是我有2个实体A和B;都与关系到第三实体C. A还与B的关系,让我们试着弄清楚:

A - > OneToOne与B和C

乙 - >一对多使用C

A和B被加载到不同的事务(拦截器)中,但接下来我做了A.setXXX(B)并执行一个entityManager.merge(A); - A有一个C和B的实例,但它们代表相同的实例(相同的ID或主键)。 因此,我得到这个错误 - 事实上,我有2个不同的C实例(一个与A和另一个与B)代表相同的实体(相同的PK)。如何解决这个问题?我想过做一些像B.setXXX(a.getXXX())的东西,但听起来很乱。有什么建议么?

+0

你可以添加你的映射文件和实体类吗? – Mihir

+0

如果您使用属性cascade =“all”,只需从映射文件中删除cascade =“all”并执行即可。 – Mihir

+0

我纠正了文中错误的关系;实际上A - > OneToOne与C(单向关系;没有级联存在)和B - > OneToMany与C(级联=所有;也是一个双向one-C映射B with ManyToOne)。我会尝试删除它。 –

回答

0

感谢@Tobb和@Mihir我能想出发生了什么事情 - 当我打电话entityManager.merge(A)我有以下情况:

一个点,B和C; B指向C的列表; C指向B的另一个实例,该实例又指向C的列表;

但是,B的两个实例代表相同的对象(相同的db PK)。这同样适用于C的列表,所以公平地得到消息我必须去除关系B - > C中的级联=全部的相同集合的两个表示,所以合并不会跨过这个分支图形。

相关问题