這裏記錄hibernate中組合主鍵的annotation方式。
hibernate-annotations說明文檔中有說到組合主鍵使用annotation的方式實現,如下幾種
下面是定義組合主鍵的幾種語法:
1. 將組件類註解爲@Embeddable,並將組件的屬性註解爲@Id
2. 將組件的屬性註解爲@EmbeddedId
3. 將類註解爲@IdClass,並將該實體中所有屬於主鍵的屬性都註解爲@Id
第一種方式實例:
1.主鍵類,如下
package com.seed.lee.model;
import javax.persistence.Column;
import javax.persistence.Embeddable;
/**
* 這個類作爲Person類的(組合主鍵)主鍵類
*
* @author Administrator
*
*/
@Embeddable //這裏就是annotation文檔中所說的,將組件類註解爲@Embeddable
public class PeopleUionPKID implements java.io.Serializable {
private String firstName;
private String secondName;
@Column(length=20)
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(length=20)
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof PeopleUionPKID){
PeopleUionPKID pk=(PeopleUionPKID)obj;
if(this.firstName.equals(pk.firstName)&&this.secondName.equals(pk.secondName)){
return true;
}
}
return false;
}
@Override
public int hashCode() {
return super.hashCode();
}
}
2.與數據庫表對應的類
package com.seed.lee.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Peopel {
PeopleUionPKID uionPKID = new PeopleUionPKID();
private int age;
private String sex;
private String job;
@Id //這裏就是文檔中所述的,並將組件的屬性註解爲@Id
public PeopleUionPKID getUionPKID() {
return uionPKID;
}
public void setUionPKID(PeopleUionPKID uionPKID) {
this.uionPKID = uionPKID;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Column(length=4)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Column(length=20)
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
說明:除了代碼中標爲粗體的與普通的單主鍵類不同之外,其他都大同小異.
第二種方式比較簡單
1.主鍵類,這個類不需要做任何的註解
package com.seed.lee.model;
import javax.persistence.Column;
/**
* 這個類作爲Person類的(組合主鍵)主鍵類
*
* @author Administrator
*
*/
public class PeopleUionPKID implements java.io.Serializable {
private String firstName;
private String secondName;
@Column(length=20)
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(length=20)
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof PeopleUionPKID){
PeopleUionPKID pk=(PeopleUionPKID)obj;
if(this.firstName.equals(pk.firstName)&&this.secondName.equals(pk.secondName)){
return true;
}
}
return false;
}
@Override
public int hashCode() {
return super.hashCode();
}
}
2.數據表映射的類(只需要在主鍵類的引用中添加@EmbeddedId就可以)
package com.seed.lee.model;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Peopel {
PeopleUionPKID uionPKID = new PeopleUionPKID();
private int age;
private String sex;
private String job;
@EmbeddedId
public PeopleUionPKID getUionPKID() {
return uionPKID;
}
public void setUionPKID(PeopleUionPKID uionPKID) {
this.uionPKID = uionPKID;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Column(length=4)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Column(length=20)
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
第三種方式,這種方式相對麻煩一點,據說這種是符合常人的編碼規範的,所以有很多人用
1. 依然需要主鍵類,類中不需要註解任何的屬性
package com.seed.lee.model;
import javax.persistence.Column;
/**
* 這個類作爲Person類的(組合主鍵)主鍵類
*
* @author Administrator
*
*/
public class PeopleUionPKID implements java.io.Serializable {
private String firstName;
private String secondName;
@Column(length=20)
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(length=20)
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof PeopleUionPKID){
PeopleUionPKID pk=(PeopleUionPKID)obj;
if(this.firstName.equals(pk.firstName)&&this.secondName.equals(pk.secondName)){
return true;
}
}
return false;
}
@Override
public int hashCode() {
return super.hashCode();
}
}
2.數據表對應的類(這個類中需要將表的組合主鍵也記錄成屬性,並在所有的主鍵字段的get方法上註解@id,最後就是在類名上方註解
@IdClass(value=PeopleUionPKID.class),PeopleUionPKID就是主鍵類的類短名)
package com.seed.lee.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
@Entity
@IdClass(value=PeopleUionPKID.class)
public class Peopel {
// PeopleUionPKID uionPKID = new PeopleUionPKID();
private String firstName;
private String secondName;
private int age;
private String sex;
private String job;
// @EmbeddedId
// public PeopleUionPKID getUionPKID() {
// return uionPKID;
// }
//
// public void setUionPKID(PeopleUionPKID uionPKID) {
// this.uionPKID = uionPKID;
// }
public int getAge() {
return age;
}
@Id
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Id
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
public void setAge(int age) {
this.age = age;
}
@Column(length=4)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Column(length=20)
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
具體查看hibernate annotation的說明文檔。