如果一张表中存在联合主键,在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注解。
注意:联合主键类还是需要。