《Hibernate學習筆記七》一對一聯合主鍵的關聯
前面我們講解了一對一外鍵關聯和一對一主鍵的關聯,這篇博文介紹下聯合主鍵的關聯關係。
先回顧下聯合主鍵,可以參考以前寫的這篇博文:http://blog.csdn.net/u010412719/article/details/51275744
聯合主鍵的關聯
假設有Husband實體類和Wife實體類,Husband類中的主鍵爲id,而 Wife實體類中的主鍵由id 和name聯合主導。
先看Wife實體類
聯合主鍵的映射這裏採用第三種方法:@IdClass類做。其中,主鍵類WifePK要繼承Serialable接口,以及要重寫equals、hashCode方法。
代碼如下:
@Entity
@IdClass(WifePK.class)
public class Wife {
private int id;
private String name;
private int age;
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.hibernate.model;
import java.io.Serializable;
public class WifePK implements Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return this.name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof WifePK) {
WifePK pk = (WifePK) obj;
if(this.id==pk.getId()&&this.name.equals(pk.getName())){
return true;
}
}
return false;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
Husband類
在單個主鍵中,我們一對一採用的註解爲:@JoinColumn(name=”wifeId”)
現在wife中有兩個主鍵,應該怎麼辦呢??
方法如下:
@OneToOne
@JoinColumns(
{
@JoinColumn(name="wifeId",referencedColumnName="id"),
@JoinColumn(name="wifeName",referencedColumnName="name")
}
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Husband類詳細代碼如下:
@Entity
public class Husband {
private int id;
private String name;
private Wife wife;
@Id
@GeneratedValue
public int getId() {
return id;
}
@OneToOne
@JoinColumns(
{
@JoinColumn(name="wifeId",referencedColumnName="id"),
@JoinColumn(name="wifeName",referencedColumnName="name")
}
)
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
測試類代碼如下:
測試代碼中主要借用了SchemaExport來將SQL語句輸出到數據庫中。
public class Test {
@Test
public void testSchema(){
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata();
SchemaExport schemaExport = new SchemaExport();
schemaExport.create(EnumSet.of(TargetType.DATABASE), metadata);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
執行結果如下:
從結果可以看出,這樣就建立了一個一對一的聯合主鍵之間的關聯。
小結
上面主要介紹了一對一聯合主鍵的關聯關係的Annotation的實現,而關於.xml文件的實現由於相當繁瑣,這裏不再進行介紹。
from: http://blog.csdn.net/u010412719/article/details/51298790