hibernate聯合主鍵生成機制(annotation方式)

這裏記錄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的說明文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章