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