java - hibernate 级联 : Object references an unsaved transient instance - save the transient instance before flushing

标签 java hibernate orm

@Entity
@Table(name = "parent")
public final class Parent extends Base {

@OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
private Person person;

并做(除其他外)这个:

Parent parent = new Parent();
Person person = new Person();
parent.setPerson(person);
session.save(parent);

我得到了提到的异常?

我之前需要手动调用 session.save(person) 吗?我是否必须向子类定义(它引用父类的地方)添加级联类型注释?

还是我错过了其他明显的东西?

我不想使用 CascadeType.ALL,因为当 parent 被删除时我想保留这个人( child )。

两个实体/表都扩展了一个公共(public)基表:

@MappedSuperclass()
public abstract class Base {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    public Integer getId() {
    return id;
    }

这会影响需要哪种级联类型吗?

最佳答案

您没有提到 Hibernate 版本,但自从我开始使用它以来这并没有改变。

正如您在 Hibernate reference 中所读到的那样,要获得 Java 标准 SAVE_UPDATE,您需要在 Hibernate 中使用 {CascadeType.PERSIST, CascadeType.MERGE}

编辑:看到更新后的信息,您现在正在做的事情会导致 Hibernate 将其视为双向一对一映射。这基本上意味着对于这两个表中的任何一个中的每个对象,必须有另一个表中具有相同 ID 的对应项。因此,你不能只删除其中一个,你会失去 FK 的完整性。

如果您希望它是一个单向映射,例如,如果您希望能够删除人但离开 parent ——您必须指定一个 FK,通常通过 @JoinColumn,喜欢 @JoinColumn(name="PERSON_ID", unique=false, nullable=true, insertable=true, updatable=true)

关于java - hibernate 级联 : Object references an unsaved transient instance - save the transient instance before flushing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9032998/

相关文章:

java - 如何在windows上使用java导入mysql转储文件到MySQL服务器(7)

java - 部署时 java.lang.Boolean 的 Jersey 正文编写器错误

c# - 具有属性继承和事件冒泡的分层对象模型?

java - Hibernate 中的部分对象加载

java - Seam hibernate 无法打开连接

java - 如何从 NavDrawer 中的项目单击开始新 Activity

java - 使用 Hibernate Search 对短语进行模糊搜索

java - 出现错误 java.lang.ClassCastException : java. lang.String 无法转换为 [Ljava.lang.Object;

mysql - Symfony4.1 Doctrine ManyToMany 减少查询次数

python - Django:如何根据查找表的值连接表