Java 带有抽象实体的JPA OneToMany级联

Java 带有抽象实体的JPA OneToMany级联,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个抽象实体及其子类 @Entity @Inheritance(JOIN) public abstract class Foo { /* ... */ } @Entity public class Bar extends Foo { /* ... */ } @Entity public class Baz extends Foo { /* ... */ } 以及一个包含Foos列表的类: @Entity public class Qux { @OneToMany(cascad

我有一个抽象实体及其子类

@Entity
@Inheritance(JOIN)
public abstract class Foo { /* ... */ }

@Entity
public class Bar extends Foo { /* ... */ }

@Entity
public class Baz extends Foo { /* ... */ }
以及一个包含
Foo
s列表的类:

@Entity
public class Qux {

    @OneToMany(cascade = ALL)
    List<Foo> foos;

}
这很奇怪,因为我有
cascade=ALL
。因此我尝试将其更改为
cascade=MERGE
,错误更改为

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: Foo

我怎样才能使这种关系发挥作用?(我使用的是Hibernate 5.2.7)

在你的情况下,你不需要
cascade=ALL
,因为这里太宽了,你的具体情况需要
SAVE\u UPDATE
cascade类型,试着把它改成
cascade=SAVE\u UPDATE
或者使用注释
@cascade({CascadeType.SAVE\u UPDATE})
。我希望保持JPA兼容,而
@Cascade
则不然。但我仍然不明白为什么会发生这种情况……您描述的是
@OneToMany
中缺少的
级联
选项的行为,但是使用
cascade=ALL
cascade=MERGE
应该可以避免这种情况。我猜您启用了flushmode auto,在设置所有引用并调用merge之前导致持久性上下文刷新,例如尝试读取现有实体并设置它们与新实例之间的关联。在设置引用之前,请确保您正在从当前上下文中读取Foo,或显式地对其调用merge(并使用托管实例)。请发布整个Hibernate堆栈跟踪。
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: Foo