hibernate – JPA一对一映射

我有以下表结构与一对一映射.

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

点赞