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(); //关闭 } }好了,联合主键就搞定了,,还是得多敲代码。
相关文章推荐
- JPA开发总结<一>
- JPA开发总结<四>--一对一双向关联
- JPA开发总结<二>--基本操作+JPQL查询
- JPA开发总结<三>--一对多双向关联
- JPA开发总结<五>--多对多双向关联
- JPA开发总结<七>--Bug总结
- 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计
- <杂谈1002>HTML作为GUI前段,Java/NDK作为业务后端开发方式总结
- android WebView开发总结<续>
- 实时开发框架Meteor API解读系列<六> DDP
- FlexAir 开源版-多人视频聊天室,网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实战>
- &lt;&lt;高效程序员的45个习惯-敏捷开发修炼之道&gt;&gt;总结
- 在线支付开发流程总结<包括客户端与服务端>
- 友善官方<<Mini2440 Linux移植开发实战指南>>问题总结
- 友善官方<<Mini2440 Linux移植开发实战指南>>问题总结
- Hibernate3.2(10):联合主键<composite-id.../>
- ASP.NET MVC (Razor)开发 <<周报与绩效考核系统>> 总结与分享
- <学习笔记>Windows驱动开发技术详解__IRP的同步
- UML参考手册 第三部分 参 考 资 料 第13章 术 语 大 全 <六>
- <寒江独钓>Windows内核安全编程__一个简单的Windows串口过滤驱动程序的开发