Hibernate用注解配置复合主键

hibernate用注解配置复合主键有三种方式:

@Embeddable @Id @Embedded
@Embeddable @EmbeddedId
@IdClass @Id

解释一下这几种方法的区别:
 
@Embeddable表示这个类可以嵌入到别的类中去,常以表示其他类的某个属性
@Embedded它和@Embeddable正好相反,它用来表示某个属性是被嵌入进来的。  
@EmbeddedId = @Embedded + @Id
 
声明:
 
如果采用第三种方式,则必须为主键类写上默认构造方法,因为Hibernate是通过默认构造方法来实例化主键类的对象的。首先,给出主键类的源代码:
 

 

import java.io.Serializable;
import javax.persistence.Embeddable;
 
@Embeddable
public class CompositeKeyModelKey implements Serializable {
 
    private static final long serialVersionUID = 1717638966560959020L;
    private Integer kkey1;
    private Integer kkey2;
 
    public CompositeKeyModelKey(Integer kkey1, Integer kkey2) {
        this.kkey1 = kkey1;
        this.kkey2 = kkey2;
    }
 
    public Integer getkkey1() {
        return kkey1;
    }
 
    public void setkkey1(Integer kkey1) {
        this.kkey1 = kkey1;
    }
 
    public Integer getkkey2() {
        return kkey2;
    }
 
    public void setkkey2(Integer kkey2) {
        this.kkey2 = kkey2;
    }
     
    @Override
    public boolean equals(Object obj) {
        if(this == obj) {
            return true;
        }
         
        if(! (obj instanceof CompositeKeyModelKey)) {
            return false;
        }
         
        CompositeKeyModelKey key = (CompositeKeyModelKey)obj;
         
        if(!kkey1.equals(key.getkkey1())) {
            return false;
        }
         
        if(!kkey2.equals(key.getkkey2())) {
            return false;
        }
         
        return true;
    }
     
    @Override
    public int hashCode() {
         
        int result = 0;      
        result = kkey1 == null ? 0 : kkey1.hashCode();
        result = 29 * (kkey2 == null ? 0 : kkey2.hashCode()) + result;
        return result;
    }
}

 

第一种方法(@Embeddable + @Id + @Embedded)的Pojo源代码如下:
 

 

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name="COMPOSITE_KEY_TABLE")
public class CompositeKeyModel {
     
    private CompositeKeyModelKey compositeKeyModelKey;
     
    private String field;
 
    @Column(name = "FIELD")
    public String getField() {
        return field;
    }
 
    public void setField(String field) {
        this.field = field;
    }
 
    @Id
    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "kkey1", column = @Column(name="KEY1")),
        @AttributeOverride(name = "kkey2", column = @Column(name="KEY2"))
    })
    public CompositeKeyModelKey getCompositeKeyModelKey() {
        return compositeKeyModelKey;
    }
 
    public void setCompositeKeyModelKey(CompositeKeyModelKey compositeKeyModelKey) {
        this.compositeKeyModelKey = compositeKeyModelKey;
    }
     
}

 

第二种方法(@Embeddable + @EmbeddedId)的Pojo源代码如下:
 

 

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
 
@Entity
@Table(name="COMPOSITE_KEY_TABLE")
public class CompositeKeyModel {
     
    private CompositeKeyModelKey compositeKeyModelKey;
     
    private String field;
 
    @Column(name = "FIELD")
    public String getField() {
        return field;
    }
 
    public void setField(String field) {
        this.field = field;
    }
 
    @EmbeddedId
    @AttributeOverrides({
        @AttributeOverride(name = "kkey1", column = @Column(name="KEY1")),
        @AttributeOverride(name = "kkey2", column = @Column(name="KEY2"))
    })
    public CompositeKeyModelKey getCompositeKeyModelKey() {
        return compositeKeyModelKey;
    }
 
    public void setCompositeKeyModelKey(CompositeKeyModelKey compositeKeyModelKey) {
        this.compositeKeyModelKey = compositeKeyModelKey;
    }
     
}

 

第三种方法(@IdClass + @Id)的Pojo类源代码如下:
 

 

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
 
@Entity
@Table(name="COMPOSITE_KEY_TABLE")
@IdClass(CompositeKeyModelKey.class)
public class CompositeKeyModel {
     
    private Integer kkey1;
     
    private Integer kkey2;
     
    private String field;
 
    @Column(name = "FIELD")
    public String getField() {
        return field;
    }
 
    public void setField(String field) {
        this.field = field;
    }
 
    @Id
    @Column(name = "KEY1")
    public Integer getKkey1() {
        return kkey1;
    }
 
    public void setKkey1(Integer kkey1) {
        this.kkey1 = kkey1;
    }
 
    @Id
    @Column(name = "KEY2")
    public Integer getKkey2() {
        return kkey2;
    }
 
    public void setKkey2(Integer kkey2) {
        this.kkey2 = kkey2;
    }
 
}