我有以下表结构与一对一映射.
public class Parent {
private long parentPK(Parent primary key);
private Child child;
@OneToOne(
cascade = {CascadeType.ALL },
fetch = FetchType.LAZY,
mappedBy = "child"
)
public Child getChild() {
return this.child;
}
}
public class Child{
private long childPK(Child primary key);
private Parent parentFK;(parent foreign key)
@OneToOne
@JoinColumn(
name = "PARENT_FK",
referencedColumnName = "PARENT_PK"
)
public Parent getParentFK() {
return this.parentFK;
}
}
注意:父表没有对子表的引用. Child将父主键作为外键列.这里父母和孩子的主要关键是不同的.
根据我的要求,对于持久化父级,子级记录应自动保留,而不显式设置子表的外键.
执行上述结果导致“无法在CHILD表中插入PARENT_FK的非空记录”.
有人可以指导达到上述要求的可能性吗?
最佳答案 您的映射不正确.
你在这里遇到的主要问题是你的mappedBy =“child”是指Child类的子属性 – 而不是Parent类.子类上没有子属性,您需要在Child类中引用parentPK属性.
我建议将PK / FK保留在实体字段名称之外,因为它可能有点令人困惑.
以下是更新的父/子实体.
(我已切换到现场访问,但这只是我的偏好)
@Entity
public class Child {
@Id
@Column(name = "childPK")
private Long id;
@OneToOne
@JoinColumn(
name = "PARENT_FK",
referencedColumnName = "PARENT_PK"
)
private Parent parent;
@Entity
public class Parent {
@Id
@Column(name = "PARENT_PK")
private long id;
@OneToOne(
cascade = {CascadeType.ALL},
fetch = FetchType.LAZY,
--> mappedBy = "parent") //Refers to parent field of the Child class
private Child child;
请注意,您已定义了双向OneToOne关系.在JPA中,双向关系有一个拥有的一方 – 具有连接信息的一方,在你的情况下是Child – 和一个反面 – 在你的情况下具有mappedBy属性的一方,Parent.掌握这个是一个好主意.该参考文献着眼于OneToOne关系,还有很多其他关系. https://en.wikibooks.org/wiki/Java_Persistence/OneToOne