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

时间:2012-01-27 12:01:58

标签: 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,因为父母被删除时我想保留这个人(孩子)。

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

@MappedSuperclass()
public abstract class Base {

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

    public Integer getId() {
    return id;
    }

这种效果是否需要级联类型?

1 个答案:

答案 0 :(得分:5)

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

正如您在Hibernate reference中所读到的,要获得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)