JPA一对一映射

时间:2015-07-28 13:26:56

标签: hibernate jpa

我有以下表结构,一对一映射。

app.get

注意:父表没有对子表的引用。 Child将父主键作为外键列。这里父母和孩子的主键是不同的。

根据我的要求,在持久父级上,子记录应自动保留,而不显式设置子表的外键。 执行上述结果"不能在CHILD表"中插入PARENT_FK的非空记录。 有人可以指导达到上述要求的可能性吗?

3 个答案:

答案 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();