Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(新标题)jpa合并不能很好地处理双向java关系_Java_Hibernate_Jpa_Cycle_Cascade - Fatal编程技术网

(新标题)jpa合并不能很好地处理双向java关系

(新标题)jpa合并不能很好地处理双向java关系,java,hibernate,jpa,cycle,cascade,Java,Hibernate,Jpa,Cycle,Cascade,问题部分解决,提出了新的更具体的问题。我建议跳过旧内容。 上一个标题:“在jpa中级联合并重叠对象树”: 我有多个jpa实体树。在java中,parentchild关系是双向的。父母和孩子 相互参照。数据库端的关系总是 从子级到父级,没有连接表。这些树相互重叠。 有循环(树的总和)。我想合并所有 对象在树的根上调用EntityManager.merge()。我试过了 设置cascade type.ALL在父方的所有关系上。结果 无论根的合并顺序如何,始终如下所示: java.lang.Illeg

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

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

    @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: