JPA - OneToMany,ManyToOne,OneToOne问题

时间:2011-08-04 10:49:36

标签: java hibernate jpa one-to-many many-to-one

鉴于以下两个实体:

class Parent {
       @OneToMany(cascade=CascadeType.ALL)
       private Set<Child> children;

       (...)
}


class Child {
       @ManyToOne
       private Parent parent;

       (...)
}

我想在数据库中有两个表。一张桌子供父母使用,另一张供儿童使用。但是Hibernate创建了三个表:一个用于父项,一个用于子项,一个用于连接它们(带有两个字段的表)。

即使我将@OneToOne放在Child类的parent属性上,我仍然得到相同的结果。

我错过了什么?

3 个答案:

答案 0 :(得分:3)

mappedBy属性添加到@OneToMany课程中的Parent。这使得Child成为拥有者。

Child中,将@JoinColumn注释添加到parent字段,以便在子表中声明外键列名称。

来自@OneToMany#mappedBy上的JavaDoc:

  

拥有这种关系的领域。除非关系是单向的,否则是必需的。

单向关系需要一个连接表,但在你的情况下它是双向的,因此它是必需的。

答案 1 :(得分:2)

构建双向关联时缺少注释中的 mappedBy =“parent”属性。

class Parent {
   @OneToMany(mappedBy="parent",cascade=CascadeType.ALL)
   private Set<Child> children;

   (...)
}

class Child {
   @ManyToOne
   private Parent parent;

   (...)
}

答案 2 :(得分:2)

如果子表中的外键列名为“parent_id”,请尝试

@OneToMany(mappedBy="parent")
private Set<Child> children;

@ManyToOne
@JoinColumn(name="parent_id")
private Parent parent;