问题得到了部分解决,提出了新的更具体的问题。我建议跳过旧内容。
上一个标题:“在jpa中级联合并重叠对象树”:
我有多个jpa实体树。关系parent< - > child在java中是双向的。父母和孩子 互相参考。数据库端的关系总是如此 从孩子到父母,没有联合表。树木相互重叠。 有循环(在树的总和)。我想合并所有 对象在树的根上调用EntityManager.merge()。我试过了 在父母一方的所有关系上设置CascadeType.ALL。结果 总是如下,无论根合并的顺序是什么: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException:非null属性 引用瞬态值 - 必须先保存瞬态实例 当前操作:com.example.Foo1 - > com.example.Foo2
我该怎么做才能做到正确?
新问题(更新):
原因确实是双向java关系如果使用merge而不能很好地级联(适用于持久性)。因此,我想根据以下情况提出一个更具体的新问题:
A类:
@Entity
class A {
@OneToMany(mappedBy = "a", cascade = CascadeType.All)
List<B> bs;
//...
}
B组:
@Entity
class B {
@ManyToOne
A a;
//...
}
执行:
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:非null属性引用瞬态值 - 必须在当前操作之前保存瞬态实例:com.example.B - &gt; com.example.A
如果我理解正确,a
被合并,并且已经级联,则在他自己的合并之前尝试在他的孩子b
上执行合并。但正确的数据库操作顺序是首先插入a
然后插入b
。
我解决了从级联中退出的问题。但我们可以在这里进行级联工作吗?对我来说似乎有可能。