如果一张表中存在联合主键,在hibernate中会把联合主键封装成一个类,然后在实体类中引用此联合主键类。联合主键类需要实现序列化,重写equals以及hashcode方法。
比如Emp有id和name两个主键,示例如下:
package com.yy.hibernate.model;
import java.io.Serializable;
public class EmpCompositePK implements Serializable {
public int id;
public String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof EmpCompositePK){
EmpCompositePK pk = (EmpCompositePK)obj;
if(this.id==pk.getId()&&this.name.equals(pk.getName()))
return true;
}
return false;
}
@Override
public int hashCode() {
return this.name.hashCode();
}
}
需要在Emp.java中持有上述联合主键类的引用,如下:
private EmpCompositePK pk;
在Emp.hbm.xml配置文件中,主键定义如下:
<composite-id name="pk" class="com.yy.hibernate.model.EmpCompositePK">
<key-property name="id"></key-property>
<key-property name="name"></key-property>
</composite-id>
即完成了联合主键的配置。
下面是使用Annotation的方式进行配置:
方式一:
在联合主键类上使用@Embeddable注解:
package com.yy.hibernate.model;
import java.io.Serializable;
import javax.persistence.Embeddable;
@Embeddable
public class EmpCompositePK implements Serializable {
public int id;
public String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof EmpCompositePK){
EmpCompositePK pk = (EmpCompositePK)obj;
if(this.id==pk.getId()&&this.name.equals(pk.getName()))
return true;
}
return false;
}
@Override
public int hashCode() {
return this.name.hashCode();
}
}
在实体上使用@Id
private EmpCompositePK pk;
@Id
public EmpCompositePK getPk() {
return pk;
}
public void setPk(EmpCompositePK pk) {
this.pk = pk;
}
方式二:
直接在实体类中使用如下注解:
@EmbeddedId
public EmpCompositePK getPk() {
return pk;
}
方式三:
在实体上上使用如下注解:
@IdClass(EmpCompositePK.class)
同时在实体类的id和name的getXXX方法上加上@Id注解。
注意:联合主键类还是需要。