两个属性定义一个主键:JPA中的联合主键
2013-04-02 10:50
639 查看
JPA基础(十三):JPA中的联合主键
两个或多个字段组成的主键,我们叫联合主键。在面向对象中,我们用JPA怎么定义这种情况呢?怎么定义联合主键?用面向对象的思想来思考的话,联合主键里的复合主键(字段),可以把它看成一个整体,然后采用一个主键类来描述这个复合主键的字段。这里面主要是一些类的主键是联合主键, 主键是有两个属性构成的
关于联合主键类,大家一定要遵守以下几点JPA规范:
必须提供一个public的无参数构造函数。
必须实现序列化接口。
必须重写hashCode()和equals()这两个方法。这两个方法应该采用复合主键的字段作为判断这个对象是否相等的。
联合主键类的类名结尾一般要加上PK两个字母代表一个主键类,不是要求而是一种命名风格。
AirLinePK.java:
1 @Embeddable 2 //这个注解代表ArtLinePK这个类是用在实体里面,告诉JPA的实现产品:在实体类里面只是使用这个类定义的属性。 3 //简单的理解为:ArtLinePK里的属性可以看成是ArtLine类里的属性,好比ArtLinePK的属性就是在ArtLine里定义的 4 public class AirLinePK implements Serializable{ 5 @Column(length=3) 6 private String startCity; 7 @Column(length=3) 8 private String endCity; 9 public String getStartCity() { 10 return startCity; 11 } 12 public void setStartCity(String startCity) { 13 this.startCity = startCity; 14 } 15 public String getEndCity() { 16 return endCity; 17 } 18 public void setEndCity(String endCity) { 19 this.endCity = endCity; 20 } 21 @Override 22 public int hashCode() { 23 final int prime = 31; 24 int result = 1; 25 result = prime * result + ((endCity == null) ? 0 : endCity.hashCode()); 26 result = prime * result 27 + ((startCity == null) ? 0 : startCity.hashCode()); 28 return result; 29 } 30 @Override 31 public boolean equals(Object obj) { 32 if (this == obj) 33 return true; 34 if (obj == null) 35 return false; 36 if (getClass() != obj.getClass()) 37 return false; 38 AirLinePK other = (AirLinePK) obj; 39 if (endCity == null) { 40 if (other.endCity != null) 41 return false; 42 } else if (!endCity.equals(other.endCity)) 43 return false; 44 if (startCity == null) { 45 if (other.startCity != null) 46 return false; 47 } else if (!startCity.equals(other.startCity)) 48 return false; 49 return true; 50 } 51 52 }
AirLine.java:
1 @Entity 2 public class AirLine { 3 @EmbeddedId 4 //这个注解用于标注id这个属性为实体的标识符,因为我们使用的是复合主键类,所以我们要用@EmbeddedId这个专门针对复合主键类的标志实体标识符的注解。 5 private AirLinePK id; 6 @Column(length=20) 7 private String name; 8 public AirLinePK getId() { 9 return id; 10 } 11 public void setId(AirLinePK id) { 12 this.id = id; 13 } 14 public String getName() { 15 return name; 16 } 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 }
测试:
1 public class AirLineTest { 2 @Test 3 public void save(){ 4 EntityManagerFactory factory=Persistence.createEntityManagerFactory("sample");//形如sessionFactory 5 EntityManager em=factory.createEntityManager(); 6 em.getTransaction().begin(); 7 AirLinePK id=new AirLinePK(); 8 id.setStartCity("SHA"); 9 id.setEndCity("PEK"); 10 AirLine airline=new AirLine(); 11 airline.setId(id); 12 airline.setName("上海飞北京"); 13 em.persist(airline); 14 em.getTransaction().commit(); 15 em.close(); 16 factory.close(); 17 } 18 }
生成的联合主键如图:
![](http://pic002.cnblogs.com/images/2011/354918/2011120314141757.jpg)
相关文章推荐
- C++ 计算一个线段长度,两个端点的坐标值分别为(100,200)(200,300)。要求:定义一个CLine类,属性是CPoint对象。(初始化参数列表)
- hibernate中怎样配置两个联合属性为唯一约束(非联合主键)
- 定义一个计算机类:属性:品牌;价格;颜色; 方法:(1)编程的功能 (2)上网的功能 实例化两个对象:“lenovo”;“hasee”
- 定义一个圆类——Circle,在类的内部提供一个属性:半径(r),同时 提供 两个 方 法 : 计算 面积 ( getArea() ) 和 计算 周长(getPerimeter()) 。 通过两个方法
- (礼拜一log)前端开发:<td> 标签的 colspan 属性 & 两个div并排、一个宽度固定的实现方法
- 定义一个类Demo,其中定义一个求两个数据和的方法,定义一个测试了Test,进行测试。
- 定义一个数组类(Array),要求动态分配大小,并在此基础上实现以下的两个子类:?反转类?排序类
- JPA 的联合主键
- mysql 外键(foreign key)的使用,同一个table的两个外键对应一个table的主键
- Annotation使用两个foreign key做联合主键
- 用css定义一个div,如何用js取得样式的属性呢?
- 利用RowFilter属性,将一个DataSet绑定到两个DataGrid
- ASP.net:利用RowFilter属性,将一个DataSet绑定到两个DataGridhttp://www.ninedns.com/asp.net/2007430223347.html
- 9.1 定义一个带参数的宏,使两个参数互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。
- Hibernate中联合主键映射时有一个也是外键的一种解决方法
- 《Python cookbook》 “定义一个属性可由用户修改的装饰器” 笔记
- css基础 一个class属性给两个名字(实用技巧)
- 【OC复合题】之定义一个学生类,需要有姓名,年龄,考试成绩三个成员属性,创建5个对象,属性可以任意值。(Objective-C)
- JPA中的多对多和联合主键映射
- C# 定义用户控件并添加属性(制作一个限定输入的文本框)