休眠级联:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例


@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;
    }

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

你没有提到Hibernate版本,但自从我开始使用它以来,它就没有改变过。

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

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

如果您希望

它是单向映射,例如,如果您希望能够删除人员但保留父级 - 则必须指定FK,通常通过@JoinColumn,例如 @JoinColumn(name="PERSON_ID", unique=false, nullable=true, insertable=true, updatable=true)

最新更新