2011-08-04 69 views
2

鉴于以下两个实体:JPA - 一对多,多对一,OneToOne问题

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

     (...) 
} 


class Child { 
     @ManyToOne 
     private Parent parent; 

     (...) 
} 

我想在数据库中的两个表。一张桌子给父母,另一张给孩子。但是Hibernate创建了三个表格:一个用于父母,一个用于孩子,另一个用于加入他们(两个字段的表格)。

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

我错过了什么?

回答

2

mappedBy =“parent”注解中的属性在构建双向关联时缺失。

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

    (...) 
} 

class Child { 
    @ManyToOne 
    private Parent parent; 

    (...) 
} 
+0

如果您拥有Person OneToMany项目,并且项目只能由一个人拥有,该怎么办?该项目有多个一对一或一对一?对我来说,它似乎应该是OneToOne那里孩子现在(考虑你只能有一个父母) – momomo

3

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

Child@JoinColumn注释添加到parent字段为了在子表中声明外键列名称。

根据JavaDoc上@OneToMany#mappedBy

拥有该关系的字段。除非关系是单向的,否则是必需的。

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

+0

休眠我会自动生成一个正确的FK:PARENT_ID。使用JoinColumn很重要吗? – Stephan

+0

@Stephan否,如果生成的列适合您,则不需要使用“@ JoinColumn”。 – Thomas

2

鉴于儿童表的外键列被称为 “PARENT_ID”,尝试

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

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

“@ JoinColumn”重要吗? – Stephan

+0

这是很好的。 hibernate没有外键约束的知识。所以hibernate只能猜测(使用名称模式假设)哪个列用于该关系。因此很明确。 – rompetroll