对于绝大多数情况一个表只会有一个字段是主键,但是比较特殊的情况下可能会有多个字段一起构成主键,这样的主键就是联合主键了。下面用一个小例子来说明这个情况,我们知道飞行用的航线一般有起点和终点构成,也就是说可以根据起点和终点确定航线,这种情况联合主键就能发挥它的作用了。针对这种情况我们需要把起点和终点封装成一个对象之后作为联合主键使用。
1 联合主键的java类
package org.lxh.info;
import java.io.Serializable;
import javax.persistence.Embeddable;
@Embeddable
public class Destination implements Serializable{
private String start;
private String end;
public String getStart() {
return start;
}
public void setStart(String start) {
this.start = start;
}
public String getEnd() {
return end;
}
public void setEnd(String end) {
this.end = end;
}
}
作为联合主键的这个类必须实现Serializable接口并且类的最上面还应该有@Embeddable注解
2 用于持久化的实体类
package org.lxh.info;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
@Entity
public class AirPlanMessage {
private Destination id;
private String lineName;
private String companyName;
@EmbeddedId
public Destination getId() {
return id;
}
public void setId(Destination id) {
this.id = id;
}
public String getLineName() {
return lineName;
}
public void setLineName(String lineName) {
this.lineName = lineName;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
}
和之前不同的是这个实体类中主键就不使用@Id了而是使用@EmbeddedId,加了这个注解就说明这里的主键是联合主键
3 数据的保存操作
package org.lxh.test;
import static org.junit.Assert.*;
import java.util.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.lxh.info.AirPlanMessage;
import org.lxh.info.Destination;
import org.lxh.info.Sex;
import org.lxh.info.Student;
import org.lxh.info.Teacher;
import org.lxh.info.User;
import org.lxh.info.UserDetails;
import org.lxh.util.JpaUtil;
public class Test {
@org.junit.Test
public void testUnionPK() {
EntityManager em=null;
EntityTransaction tx=null;
try{
em=JpaUtil.getEntityManager();
tx=em.getTransaction();
tx.begin();
Destination des=new Destination();
des.setStart("昆明");
des.setEnd("上海");
AirPlanMessage air=new AirPlanMessage();
air.setId(des);
air.setLineName("昆明到上海");
air.setCompanyName("东方航空");
em.persist(air);
tx.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
if(em!=null){
em.close();
}
}
}
}
最后来看下生成的这个表的结构