(新标题)jpa合并与双向java关系不兼容

时间:2013-08-20 17:32:37

标签: java hibernate jpa cycle cascade

问题得到了部分解决,提出了新的更具体的问题。我建议跳过旧内容。

上一个标题:“在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

我解决了从级联中退出的问题。但我们可以在这里进行级联工作吗?对我来说似乎有可能。

0 个答案:

没有答案