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