Nim*_*sky 1 java orm hibernate
@Entity
@Table(name = "parent")
public final class Parent extends Base {
@OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
private Person person;
Run Code Online (Sandbox Code Playgroud)
并做(除其他事项外)这个:
Parent parent = new Parent();
Person person = new Person();
parent.setPerson(person);
session.save(parent);
Run Code Online (Sandbox Code Playgroud)
我得到提到的例外?
我以前手动需要调用session.save(person)吗?我是否必须在子类定义中添加级联类型注释(它引用父类)?
或者我错过了其他明显的东西?
我不想使用CascadeType.ALL,因为父母被删除我想保留人(孩子).
两个实体/表都扩展了一个公共Base表:
@MappedSuperclass()
public abstract class Base {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
public Integer getId() {
return id;
}
Run Code Online (Sandbox Code Playgroud)
这种级联类型的效果是否需要?
您还没有提到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)