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