当我们需要使用一个或多个属性变量(表中的一列或多列)联合起来作为主键,我们需要使用复合主键。在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);
在测试本例时笔者犯了两个低级的错误,一是测试环境的数据库不是项目运行的数据库,二是实体类中的属性命名用了关键字,请引以为戒。
分享到:
相关推荐
如果希望使用自动生成,可能需要结合`@GeneratedValue`注解和特定的生成器策略,但这在联合主键中并不常见,因为主键通常是业务相关的。 4. **关联和查询** 当使用联合主键时,关联其他实体或执行查询时,需要确保...
在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架(Java Persistence API,简称...
在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass注解**:当你需要创建一个单独的类来表示联合主键时,可以使用@IdClass。例如,假设我们有一个`Student`实体和一个`Course`实体...
联合主键通常在以下场景中使用: - 当实体的自然标识(业务上的唯一标识)由多个字段组成时。 - 需要复用部分主键信息,减少数据库冗余。 - 表关联合并,如两个表通过多个字段关联,合并成一张表后,这些字段就可能...
在JPA中,**联合主键(Composite Key)** 是指由两个或多个属性共同构成的主键,这与单个属性的简单主键相对。联合主键通常用于那些通过多个字段来唯一标识实体的情况。在关系数据库中,联合主键确保了表中每行数据...
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第15讲 JPA中的联合主键.avi
**JPA 联合主键详解** 在Java Persistence API(JPA)中,主键是用于唯一标识实体的关键字段。通常,一个实体可能只有一个主键字段,但有些情况下,为了实现唯一标识,可能需要使用两个或多个字段的组合,这就是...
**JPA联合主键详解** 在Java Persistence API (JPA) 中,主键是用于唯一标识实体的关键字段。在很多情况下,一个实体的主键可能不是由单一字段组成,而是由两个或更多个字段共同构成,这样的主键就被称为联合主键...
在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass**:这种方式需要创建一个单独的类来表示联合主键,这个类需要实现Serializable接口,并且每个主键字段都用@Id注解标识。然后在...
在 Spring Data JPA 中,建立表的联合主键是一种常见的需求,本文将详细介绍如何使用 Spring Data JPA 建立表的联合主键,并提供了两种实现方式。 首先,我们需要了解什么是联合主键。在关系数据库中,主键是用于...
然后在`SysLogs`实体类中使用`@IdClass`: ```java @Entity @IdClass(SysLogsKey.class) public class SysLogs { @Id private String id; @Id private String yhid; // 其他属性... // getters 和 setters.....
在 Java Persistence API(JPA)中,联合主键是指由多个字段组成的主键,可以使用@IdClass注解来实现。在本文中,我们将介绍如何使用@IdClass创建联合主键,并实现外部关联。 首先,我们需要创建三个实体类:...
在JPA中,主键策略是指生成主键的机制,用于标识数据库表中的每一行记录。在本文中,我们将详细讨论JPA主键策略的类型、特点和应用场景。 GenerationType.IDENTITY GenerationType.IDENTITY 是一种常用的主键...
JPA中的联合主键** 联合主键使用@EmbeddedId和@Embeddable注解,将多个字段组合成一个复合主键,适用于那些不满足单一主键条件的表。 以上就是JPA学习笔记中的关键知识点,涵盖了JPA的基本概念、环境配置、对象...
- 通常情况下,还需要指定外键字段(`mappedBy`)或者联合主键(`@PrimaryKeyJoinColumn`)来明确关联关系。 - **一对多关联**: - 使用`@OneToMany`注解表示一对多关系,通常还需要使用`@JoinColumn`或`@JoinTable`来...
联合主键(Composite Key)** - 当主键由两个或更多个字段组成时,可以使用`@IdClass`或`@EmbeddedId`来定义。 **7. 异步和缓存** - **异步处理**: 可以结合Java的ExecutorService或Spring的AsyncConfigurer进行...
在描述中提到的"基于Hibernate的JPA",意味着这个视频教程可能会深入到如何使用Hibernate作为JPA的实现。Hibernate是一个流行的开源对象关系映射(ORM)框架,它完全支持JPA规范,使得开发者可以利用Hibernate的强大...
**JPA(Java Persistence ...通过学习这些材料,你可以深入理解JPA的工作原理,如何在Spring环境中使用JPA,以及如何有效地进行数据库操作。这对于任何希望在Java企业级应用开发中使用ORM的开发者来说都是宝贵的知识。
在"09_传智播客JPA详解_使用JPQL语句进行查询"的课程中,你将深入学习如何利用JPQL进行复杂的查询,包括联合查询、子查询、分页查询以及使用JOIN操作来处理关联数据。通过这个课程,你可以掌握JPA的核心概念和实践...
#### 十、JPA联合主键 - **概念介绍**: - 联合主键是指使用多个字段共同组成一个复合主键。 - **应用场景**: - 当单个字段不足以唯一标识一条记录时,可以考虑使用联合主键。 - **实现方式**: - 通过在实体类上...