当我们需要使用一个或多个属性变量(表中的一列或多列)联合起来作为主键,我们需要使用复合主键。在EJB3.0中复合主键要求我们编写一个复合主键类( Composite Primary Key Class )。下面是个小例子,在Student中要用sid和name做复合主键。
Student实体类:
1 import javax.persistence.Column;
2 import javax.persistence.Entity;
3 import javax.persistence.Id;
4 import javax.persistence.IdClass;
5
6 @Entity
7 @IdClass(StudentPK.class)
8 public class Student {
9
10 private String sid;
11 private String name;
12 private String age;
13
14 @Id
15 public String getSid() {
16 return sid;
17 }
18 public void setSid(String sid) {
19 this.sid = sid;
20 }
21
22 @Id
23 public String getName() {
24 return name;
25 }
26 public void setName(String name) {
27 this.name = name;
28 }
29
30 @Column
31 public String getAge() {
32 return age;
33 }
34 public void setAge(String age) {
35 this.age = age;
36 }
37
38 }
主键StudentPK类:
1 import java.io.Serializable;
2
3 public class StudentPK implements Serializable{
4
5 private static final long serialVersionUID = 1L;
6
7 private String sid;
8 private String name;
9
10 public StudentPK(){}
11 public StudentPK(String sid,String name){
12 this.sid = sid;
13 this.name = name;
14 }
15
16 public String getSid() {
17 return sid;
18 }
19 public void setSid(String sid) {
20 this.sid = sid;
21 }
22 public String getName() {
23 return name;
24 }
25 public void setName(String name) {
26 this.name = name;
27 }
28
29 @Override
30 public int hashCode() {
31 final int prime = 31;
32 int result = 1;
33 result = prime * result + ((name == null) ? 0 : name.hashCode());
34 result = prime * result + ((sid == null) ? 0 : sid.hashCode());
35 return result;
36 }
37
38 @Override
39 public boolean equals(Object obj) {
40 if (this == obj)
41 return true;
42 if (obj == null)
43 return false;
44 if (getClass() != obj.getClass())
45 return false;
46 final StudentPK other = (StudentPK) obj;
47 if (name == null) {
48 if (other.name != null)
49 return false;
50 } else if (!name.equals(other.name))
51 return false;
52 if (sid == null) {
53 if (other.sid != null)
54 return false;
55 } else if (!sid.equals(other.sid))
56 return false;
57 return true;
58 }
59
60 }
主键类必需满足下列条件:
(1)必需被序列化
(2)必需有一个公共的无参构造方法
(3)必需实现equals()和hashCode()方法
当你查询Student实体时必须使用主键类才能识别实体如:
StudentPK pk = new StudentPK("bj1001","jakin");
Student student = entityManager.find(Student.class, pk);
在测试本例时笔者犯了两个低级的错误,一是测试环境的数据库不是项目运行的数据库,二是实体类中的属性命名用了关键字,请引以为戒。
分享到:
相关推荐
15_传智播客JPA详解_JPA中的联合主键.rar
15_JPA详解_JPA中的联合主键.zip 15_JPA详解_JPA中的联合主键.zip
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第15讲 JPA中的联合主键.avi
本文档简单描述了注解实现联合主键类的生成
NULL 博文链接:https://1028826685.iteye.com/blog/1525788
针对JPA资料进行整理,根据传智播客的教学视频,边看边写,文档包含了jpa的基本概念,相关注解解释,及一些增删改查的demo。本文档方便了对jpa的学习与复习,快速掌握基本操作。
JPA 联合主键实例 博文链接:https://zmx.iteye.com/blog/512468
主要介绍了java hibernate使用注解来定义联合主键的相关资料,需要的朋友可以参考下
主要介绍了Spring Data JPA 建立表的联合主键。本文详细的介绍了2种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://profound-accumulation.iteye.com/blog/2242299
NULL 博文链接:https://lc2586.iteye.com/blog/723644
JPA简单培置,JPA多对一,JPA一对一,JPA多对多,JPA联合主键几个小列子。
1.1.3 在Java中使用SQL 1.1.4 面向对象应用程序中的持久化 1.2 范式不匹配 1.2.1 粒度问题 1.2.2 子类型问题 1.2.3 同一性问题 1.2.4 与关联相关的问题 1.2.5 数据导航的问题 ...
KanColle JSON Data 因为个人需要而整理的舰队Collection的 JSON 格式基础数据。 说明 基于 整理,非官方数据,也非游戏解包,...联合主键。 前者为没有实际含义的主键编号,后者为改修阶段。 没有改过的船的remodeling
* generator 指定生成主键使用的生成器(可能是orcale中的序列)。 * @SequenceGenerator —— 注解声明了一个数据库序列。该注解有如下属性 * name 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的...
@Id 注解可将实体Bean中某个属性定义为主键,使用@GenerateValue注解可以定义该标识符的生成策略。 • AUTO - 可以是 identity column, sequence 或者 table 类型,取决于不同底层的数据库 • TABLE - 使用table...