Hibernate多个字段的级联顺序 - 对象引用未保存的瞬态实例

时间:2018-03-15 10:51:54

标签: hibernate spring-data-jpa cascade

我有以下实体

class A {
    @OneToMany(cascade = ALL)
    List<B> b;
    @OneToMany(cascade = ALL)
    List<C> c;
}

class B {
    @ManyToOne
    A a
}

class C {
    @ManyToOne
    A a;
    @ManyToOne
    B b;
}

现在我在事务中执行以下代码

A a = repository.findOne(id);
B b = new B();
C c = new C();
c.setB(b);
a.addB(b);
a.addC(c);
repository.save(a);

我从hibernate获得以下异常:

object references an unsaved transient instance - save the transient instance before flushing

如果我在添加a后保存b,我的代码就有效,因为b之前保存了c

我猜测持续存在级联的顺序非常重要。有什么方法可以确保b在c之前级联?

1 个答案:

答案 0 :(得分:0)

我可能错了,但我认为不可能确保您的B列表首先级联,但这不是最好的做法。

我认为你最简单的选择是将级联持久性添加到从C到B的关系中。

class C {
    @ManyToOne
    A a;
    @ManyToOne(cascade = PERSIST)
    B b;
}