java - hibernate中的传递持久性顺序

标签 java hibernate jpa

我有 2 个父类 A、C 和 2 个子类:B、D。两种关系都启用了传递持久性。然而,持久化 D 需要持久化 B。

class A {
    @OneToMany(cascade = {CascadeType.PERSIST}, mappedBy = "a")
    public Set<B> getBs() {
     ...
    }
}

class B {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id", nullable = false)
    public A getA() {
      ...
    }
}

class C {
    @OneToMany(cascade = {CascadeType.PERSIST}, mappedBy = "c")
    public Set<D> getDs() {
       ...
    }
}

class D {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "b_id", nullable = false)
    public B getB() {
      ...
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "c_id", nullable = false)
    public C getC() {
      ...
    }
}

我正在尝试一次性保存 B 和 D:

A a = entityManager.getReference(...);
C c = entityManager.getReference(...);

B b = new B();

D d = new D();
d.setB(b);

a.add(b);
b.setA(a);

c.add(d);
d.setC(c);

entityManager.flush();

我认为这应该是可能的。然而,我得到一个 TransientObjectException 告诉 B 在尝试保存 D 时需要持久化。

hibernate处理级联关系有特定的顺序吗?

最佳答案

当你刷新时,由于从C到D的级联,d被持久化。但是没有从D到B的级联,所以Hibernate会提示。 A 需要在 D 之前刷新才能工作,但没有理由在 A 和 D 之间有任何特定的顺序。

关于java - hibernate中的传递持久性顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8363185/

相关文章:

java - 如何引发 OptimisticLockException

java - 如何在eclipse中设置环境来创建VoltDB存储过程?

java - 我可以使用 sql INSERT 语句插入 java 实体并稍后使用 JPQL 检索它吗?

java - if语句退出程序

java - 如何使用 JGoodies 绑定(bind) JTable 中的 boolean 值

java - 是否可以在 Hibernate 中通过 OneToOne 关系映射父类(super class)和子类?

java - 如果方法不保留任何实体,那么制作 TransactionAttributeType.NOT_SUPPORTED 是否好

java - Hibernate无法将java.lang.Integer字段com.XXX.XXX.XXX.Cooperative.id设置为java.util.ArrayList

apache - 有人用过EmpireDB吗?

java - JPA id 生成通用策略