一尘不染

Hibernate级联:对象引用了一个未保存的瞬态实例-在刷新之前保存该瞬态实例

hibernate

@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,因为当删除父对象时,我想保留此人(孩子)。

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

@MappedSuperclass()
public abstract class Base {

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

    public Integer getId() {
    return id;
    }

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


阅读 199

收藏
2020-06-20

共1个答案

一尘不染

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

正如你在读Hibernate参考,以获得Java标准SAVE_UPDATE,你需要{CascadeType.PERSIST, CascadeType.MERGE}在Hibernate中。

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

如果您希望它是单向映射,例如,如果您希望能够删除此人却离开父母,则必须指定FK,通常通过来指定@JoinColumn,例如
@JoinColumn(name="PERSON_ID", unique=false, nullable=true, insertable=true, updatable=true)

2020-06-20