是否需要在Hibernate中双方映射OneToOne和OneToMany?

时间:2014-07-09 18:25:14

标签: java hibernate jpa persistence

如果我有一个简单的Person类:

public class Person {
    @OneToOne
    private Address address;

    @OneToMany
    private List<Car> cars;
}

AddressCar是否需要Person字段?大多数教程以这种方式表明,存在双向通信。

但在我的情况下,我只需要一个人的地址和汽车,但不需要地址或汽车的人。

你如何在Hibernate中映射它?谁应该对mappedBy负责?

1 个答案:

答案 0 :(得分:2)

单向@OneToOne主键关联:

@Entity  
@Table(name="person")  
public class person{  

@Id  
@Column(name="person_id") 
@GeneratedValue     
private Integer personId;  

private String name;  

@OneToOne(cascade=CascadeType.ALL)  
@PrimaryKeyJoinColumn 
private address address;

//getters & setters

}  

@Entity  
@Table(name="address")  
public class address{  

@Id  
@Column(name="address_id")    
private Integer addressId;  

private String street;  

//getters & setters

} 

单向@OneToMany主键关联:

@Entity  
@Table(name="person")  
public class person{  

@Id  
@Column(name="person_id") 
@GeneratedValue     
private Integer personId;  

private String name;  

@OneToOne(cascade=CascadeType.ALL)  
@PrimaryKeyJoinColumn 
private address address;

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "person_id")
private List<car> cars;


//getters & setters

}  

<强>更新

您应该清楚,实体如何只在一列中保留这么多ID?

请记住,许多方面都会为foeign键设置单个对象,因为一方将拥有用于保存子对象的列表。

所以你有两个选择: 1)使用特定的表来存储One和Many实体之间的关系。像这样:

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "person_id")
private List<car> cars;

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch07.html#collections-mapping

2)你也可以说许多汽车属于一个人,所以在汽车课上我们也写得像:

@ManyToOne
private person person;

http://deepeshdarshan.wordpress.com/2012/11/29/hibernate-many-to-one-unidirectional-mapping-using-annotation/

此信息用于一对多和多对一单向映射。