我有以下表结构,一对一映射。
app.get
注意:父表没有对子表的引用。 Child将父主键作为外键列。这里父母和孩子的主键是不同的。
根据我的要求,在持久父级上,子记录应自动保留,而不显式设置子表的外键。 执行上述结果"不能在CHILD表"中插入PARENT_FK的非空记录。 有人可以指导达到上述要求的可能性吗?
答案 0 :(得分:1)
您的映射是正确的,并且您没有提供保存操作的保存代码。
但是你不能保存孩子而不提供对父母的引用,你不必设置外键,但在你的保存方法中,你应该这两个:
parent.setChild(child);
child.setParent(parent);
答案 1 :(得分:1)
您的映射不正确。
您遇到的主要问题是mappedBy = “child”
引用了Child
类的子属性 - 而不是Parent
类。子类上没有子属性,您需要引用parentPK
类的Child
属性。
我建议将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
答案 2 :(得分:0)
我确实面对过类似的事情。你的地图和一切看起来都不错。看起来您已设置Child的Parent实体,而不将Parent设置为此Child实体。那就是你试图在不设置父母的情况下拯救孩子。所以你可能需要这样做:
Parent p= new Parent();
Child c = new Child();
p.setChild(c);
// c.setParent(p); Looks like this is missing in your code
session.save();