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

這裏記錄hibernate中組合主鍵的annotation方式。 java

hibernate-annotations說明文檔中有說到組合主鍵使用annotation的方式實現,以下幾種 數據庫

下面是定義組合主鍵的幾種語法: ide

1.  將組件類註解爲@Embeddable,並將組件的屬性註解爲@Id ui

2.  將組件的屬性註解爲@EmbeddedId this

3.  將類註解爲@IdClass,並將該實體中全部屬於主鍵的屬性都註解爲@Id 編碼

 

第一種方式實例:

1.主鍵類,以下 spa

package com.seed.lee.model; hibernate

import javax.persistence.Column;
import javax.persistence.Embeddable; 文檔

/**
* 這個類做爲Person類的(組合主鍵)主鍵類
*
* @author Administrator
*
*/
@Embeddable  //這裏就是annotation文檔中所說的,將組件類註解爲@Embeddable get

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的說明文檔。

相關文章
相關標籤/搜索