(新标题)jpa合并不能很好地处理双向java关系
问题部分解决,提出了新的更具体的问题。我建议跳过旧内容。 上一个标题:“在jpa中级联合并重叠对象树”: 我有多个jpa实体树。在java中,parentchild关系是双向的。父母和孩子 相互参照。数据库端的关系总是 从子级到父级,没有连接表。这些树相互重叠。 有循环(树的总和)。我想合并所有 对象在树的根上调用EntityManager.merge()。我试过了 设置cascade type.ALL在父方的所有关系上。结果 无论根的合并顺序如何,始终如下所示: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException:非空属性 引用瞬态值-必须先保存瞬态实例,然后 当前操作:com.example.Foo1->com.example.Foo2 我该怎么做才能使它正确 新问题(更新): 原因确实是如果使用merge(对persist很有效),双向java关系没有很好地级联。因此,我想根据以下场景提出一个新的、更具体的问题: A类:(新标题)jpa合并不能很好地处理双向java关系,java,hibernate,jpa,cycle,cascade,Java,Hibernate,Jpa,Cycle,Cascade,问题部分解决,提出了新的更具体的问题。我建议跳过旧内容。 上一个标题:“在jpa中级联合并重叠对象树”: 我有多个jpa实体树。在java中,parentchild关系是双向的。父母和孩子 相互参照。数据库端的关系总是 从子级到父级,没有连接表。这些树相互重叠。 有循环(树的总和)。我想合并所有 对象在树的根上调用EntityManager.merge()。我试过了 设置cascade type.ALL在父方的所有关系上。结果 无论根的合并顺序如何,始终如下所示: java.lang.Illeg
@Entity
class A {
@OneToMany(mappedBy = "a", cascade = CascadeType.All)
List<B> bs;
//...
}
执行:
A a = new A();
B b = new B();
a.setBs(Arrays.asList(new B[]{b});
b.setA(a);
//em.persist(a) works as desired.
//Probably because inserts are postponed to the end of transaction.
em.merge(a); //throws exception:
java.lang.IllegalStateException:org.hibernate.TransientPropertyValueException:Not null属性引用瞬时值-在当前操作之前必须保存瞬时实例:com.example.B->com.example.a
如果我理解正确,a
正在合并,并且已打开级联,在其自己的合并之前,尝试对其子b
执行合并。但是正确的数据库操作顺序是先插入a
,然后插入b
我解决了从cascade辞职的问题。但是我们能让cascade在这里工作吗?对我来说似乎在物理上是可能的。你能给我们看看你的jpa映射吗?抱歉,这太多了,无法展示抱歉,但这是我们可以轻松帮助你的唯一方法…我感觉这是关于cascade不使用双向引用的问题,我修复了一些这种情况。无法确认它是否完全解决了问题。
A a = new A();
B b = new B();
a.setBs(Arrays.asList(new B[]{b});
b.setA(a);
//em.persist(a) works as desired.
//Probably because inserts are postponed to the end of transaction.
em.merge(a); //throws exception: