JPA联合主键
联合主键也就是说需要多个字段才能确定数据库记录中的唯一一行。这样就需要多个字段一起,组成主键,也叫联合主键。例如飞机航线,我们需要知道飞机起飞的地点以及飞机降落的地点。所以需要飞机起飞的地点和降落的地方才能确定一条航线。AirLine表示航线,AirLinePK表示主键类。AirLinePK代码如下:
package com.yichun.bean; import java.io.Serializable; import javax.persistence.Column;
import javax.persistence.Embeddable; /**
* 联合主键。一般使用PK 只需要定义用作主键的字段
* <p>
* 联合主键类必须遵守的JPA规范:<br>
* 1、必须要提供一个public的无参数的构造方法<br>
* 2、必须要实现序列化接口<br>
* 3、必须重写hashCode()与equals()方法
*/
// 用在实体里面,只是使用该类中的属性。(该类中的属性用在持久化的类中的字段)
@Embeddable
public class AirLinePK implements Serializable {
private String startCity;// PEK,北京 CAN广州,SHA上海
private String endCity; public AirLinePK() {
} public AirLinePK(String startCity, String endCity) {
this.startCity = startCity;
this.endCity = endCity;
} @Column(length = 3, nullable = false)
public String getStartCity() {
return startCity;
} public void setStartCity(String startCity) {
this.startCity = startCity;
} @Column(length = 3, nullable = false)
public String getEndCity() {
return endCity;
} public void setEndCity(String endCity) {
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;
} }
AirLine 代码如下:
package com.yichun.bean; import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity; @Entity
public class AirLine {
private AirLinePK id;
private String name; public AirLine() {
} public AirLine(AirLinePK id) {
this.id = id;
} public AirLine(String startCity, String endCity, String name) {
this.id = new AirLinePK(startCity, endCity);
this.name = name;
} // 用于标识该属性为实体的标识符,专门用于复合主键类
@EmbeddedId
public AirLinePK getId() {
return id;
} public void setId(AirLinePK id) {
this.id = id;
} @Column(length = 20)
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
保存数据如下:
@Test
public void save() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("yichun");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin(); manager.persist(new AirLine("PEK", "SHA", "北京飞上海")); manager.getTransaction().commit();
manager.close();
factory.close();
}
查找数据如下:
@Test
public void find() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("yichun");
EntityManager manager = factory.createEntityManager(); AirLine airLine = manager.find(AirLine.class, new AirLinePK("PEK",
"SHA"));
System.out.println(airLine.getName() + " : "
+ airLine.getId().getStartCity() + " --> "
+ airLine.getId().getEndCity()); manager.close();
factory.close();
}
JPA联合主键的更多相关文章
- JPA联合主键@EmbeddedId使用详解附查询例子
花了2个小时的时间解决这个问题,网上资料太少,记录下 详情看源文件TBicPrmCompute,TBicPrmComputePK package com.isoftstone.core.dom ...
- JPA学习---第十二节:JPA中的联合主键
1.定义实体类,代码如下: (1).将联合主键放到一个类中,代码如下: package learn.jpa.entity; import java.io.Serializable; import ja ...
- JPA注解实现联合主键
当表中一个主键不能唯一标识一条记录的时候,就需要使用联合主键了,下面是使用JPA注解实现联合主键的代码 1 首先需要建立一个复合主键类,用来存放需要生产联合主键的属性,该类需要实现序列化. packa ...
- Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A ...
- hibernate 注解 联合主键映射
联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将 该类注解 ...
- SQL联合主键 查重
2014年最后一天,今天在给数据库导入数据的时候,遇到一个问题,就是联合主键去重. 事情是这样的,现有一个表M,我想找个表中导入了许多数据,并需要将字段A(int)和B(int)联合设置为主键. 但是 ...
- Hibernate注解映射联合主键的三种主要方式
今天在做项目的时候,一个中间表没有主键,所有在创建实体的时候也未加组件,结果报以下错误: org.springframework.beans.factory.BeanCreationException ...
- 联合主键用Hibernate注解映射的三种方式
第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主 ...
- EntityFramework中Mapper怎么定义联合主键?
HasKey(m => new { m.StoreId, m.CarTypeId, m.CarLevel}) 用“new {}”联合主键以“,”分隔形式定义
随机推荐
- 自动化测试尝试 动态Linq表达式生成 ftp上传
自动化测试尝试 1. Selenium IDE Selenium IDE is a Chrome and Firefox plugin which records and plays back u ...
- R.string获取的是数字或者R.integer数字不对的问题
String msg = R.string.menu_title; 获取menu_title的String值,但发现这样写报错,原因R.string.menu_title是int类型的,可是通过以下方 ...
- Linux 分区注意事项
必须分区: 1)/(根分区) 2)/swap(交换分区,当内存不超过4G时,建议swap大小为内存2倍,若超过4G,建议交换分区跟内存一样大) 推荐分区 /boot(启动分区,单独分区,最新200M)
- OAF_OAF组件系列1 - Item Style汇总(概念)
20150506 Created By BaoXinjian
- IDLE经常使用快捷键汇总
IDLE(An Integrated DeveLopment Environment for Python)是Python自带的编译器,在刚開始学习的人,或写小程序,或用于验证的时候,经经常使用到!假 ...
- Python abs() 函数
描述 abs() 函数返回数字的绝对值. 语法 以下是 abs() 方法的语法: abs( x ) 参数 x -- 数值表达式,可以是整数,浮点数,复数. 返回值 函数返回 x(数字)的绝对值,如果参 ...
- SVN版本控制业务流程详解
http://blog.sina.com.cn/s/blog_56d8ea900100y9cf.html http://jingyan.baidu.com/article/fa4125acbf509e ...
- Ruby的DevKit名词解释
为了加快运行速度,Ruby下好多扩展包都是用C语言写的二进制包,如果我们要安装就要重新编译,DevKit包主要就是将编译用的工具链打包,解决了众多依赖问题,方便了群众. 但是,在实际安装中,可能还会遇 ...
- javascript淡入淡出效果的实现思路
这个思路是最近写XScroll.js类的时候想明白的.平常我们说的淡入淡出效果,一般分成两部分,一半是淡入,另一半就是淡出了.不过经过分析,我觉得其实只需要一半就行了如题,只有思路,没有代码. 这个思 ...
- [svc]samba服务搭建
说实话搞这些很蛋疼, 没啥技术含量. What is Samba? 这个历史悠久了 Since 1992, Samba has provided secure, stable and fast fil ...