您的位置:首页 > 其它

JPA开发总结<六>--联合主键

2015-01-03 20:42 309 查看
联合主键就是将几个字段都作为主键,或者说一个以上主键的都可作为联合主键或者复合主键,开发联合主键实体类对象必须做到三个要求,一是提供一个无参构造函数,二是必须实现序列化串行接口,三是必须重写HashCode和equals方法,参数是复合主键的属性。这里我们的实例用航班做,我们知道航班有起始地,也有终止点,他们有一个共同的航班名,所以可以用联合主键来做表设计,具体看代码。

首先定义航线实体:

/**
* 航线实体
*/
@Entity
@Table(name="t_airline")
public class AirLine {

@EmbeddedId
private AirLinePK id;
@Column(length=20,nullable=false)
private String name;

public AirLine(){}
//默认构造函数中引入联合主键参数
public AirLine(String startCity,String endCity,String name) {
this.id=new AirLinePK(startCity, endCity);
this.name = name;
}

}


然后定义联合主键实体类:

/**
* 复合主键类
* 1.提供一个无参构造函数
* 2.必须实现序列化接口
* 3.必须重写HashCode和equals方法,参数是复合主键的属性
*
* Embeddable表示它标识的类是用在别的实体里面
*/
@Embeddable
public class AirLinePK implements Serializable{
@Column(length=3,nullable=false)
private String startCity;
@Column(length=3,nullable=false)
private String endCity;

public AirLinePK() {
}
public AirLinePK(String startCity, String endCity) {
this.startCity = startCity;
this.endCity = endCity;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((endCity == null) ? 0 : endCity.hashCode());
result = prime * result
+ ((startCity == null) ? 0 : startCity.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AirLinePK other = (AirLinePK) obj;
if (endCity == null) {
if (other.endCity != null)
return false;
} else if (!endCity.equals(other.endCity))
return false;
if (startCity == null) {
if (other.startCity != null)
return false;
} else if (!startCity.equals(other.startCity))
return false;
return true;
}

<!--省略。。注意联合主键要求 -->
}


最后是测试类:

public class CompositePK {

private static EntityManagerFactory factory;
private static EntityManager em;

@BeforeClass
public static void setUpBeforeClass() throws Exception {

factory = Persistence.createEntityManagerFactory("jpatest1");
em = factory.createEntityManager();
}

@Test
public void save() {

em.getTransaction().begin(); //开启事务

AirLine line = new AirLine("PEK", "SHA", "北京飞往上海");
em.persist(line);

em.getTransaction().commit(); //提交事务
em.close(); //关闭
factory.close(); //关闭
}
}
好了,联合主键就搞定了,,还是得多敲代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: