Hibernate中的Entity類之間的OneToOne關聯也存在單向關聯和雙向關聯兩種形式。
OneToOne關聯的兩個Entity類是完全對等的,任何一方都可以是這種關聯的子類(owning side),而另一方是父類(reverse side)。
1. 雙向關聯
在OneToOne關聯的兩個Entity類中,選擇一個作為子實體類(owning side),其對應的表中設定外鍵;另一個作為父實體類(inverse side)并設定mappedBy="..."關聯屬性。
父Entity類定義如下:
@Entity(name = "Phone")
public static class Phone {
@Id
@GeneratedValue
private Long id;
private String number;
@OneToOne(mappedBy = "phone", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private PhoneDetails details;
public Phone() {
}
public Phone(String number) {
this.number = number;
}
public Long getId() {
return id;
}
public String getNumber() {
return number;
}
public PhoneDetails getDetails() {
return details;
}
public void addDetails(PhoneDetails details) {
details.setPhone( this );
this.details = details;
}
public void removeDetails() {
if ( details != null ) {
details.setPhone( null );
this.details = null;
}
}
}
子Entity類定義如下:
@Entity(name = "PhoneDetails")
public static class PhoneDetails {
@Id
@GeneratedValue
private Long id;
private String provider;
private String technology;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "phone_id")
private Phone phone;
public PhoneDetails() {
}
public PhoneDetails(String provider, String technology) {
this.provider = provider;
this.technology = technology;
}
public String getProvider() {
return provider;
}
public String getTechnology() {
return technology;
}
public void setTechnology(String technology) {
this.technology = technology;
}
public Phone getPhone() {
return phone;
}
public void setPhone(Phone phone) {
this.phone = phone;
}
}
在這種雙向關聯中,Hibernate自動為子實體類(owning side)中的外鍵屬性設定UNIQUE限制。如果違反了該限制,則在通路父實體類時會抛出
org.hibernate.HibernateException
異常。
2. 單向關聯
在OneToOne單向關聯中,隻需在子實體類(owning side)設定關聯,隻需在子實體類(owning side)對應的表中設定外鍵。
父Entity類定義如下:
@Entity(name = "PhoneDetails")
public static class PhoneDetails {
@Id
@GeneratedValue
private Long id;
private String provider;
private String technology;
public PhoneDetails() {
}
public PhoneDetails(String provider, String technology) {
this.provider = provider;
this.technology = technology;
}
public String getProvider() {
return provider;
}
public String getTechnology() {
return technology;
}
public void setTechnology(String technology) {
this.technology = technology;
}
}
子Entity類定義如下:
@Entity(name = "Phone")
public static class Phone {
@Id
@GeneratedValue
private Long id;
private String number;
@OneToOne
@JoinColumn(name = "details_id")
private PhoneDetails details;
public Phone() {
}
public Phone(String number) {
this.number = number;
}
public Long getId() {
return id;
}
public String getNumber() {
return number;
}
public PhoneDetails getDetails() {
return details;
}
public void setDetails(PhoneDetails details) {
this.details = details;
}
}