Hibernate 联合主键有三种写法 :
第一种:使用 @Embeddable注解
import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class TestPerson implements Serializable{ private static final long serialVersionUID = 1L; private String password; private String email; private String adress; @Id private TestPersonPk testPersonPk; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } public TestPersonPk getTestPersonPk() { return testPersonPk; } public void setTestPersonPk(TestPersonPk testPersonPk) { this.testPersonPk = testPersonPk; } }
import java.io.Serializable; import javax.persistence.Embeddable; @Embeddable public class TestPersonPk implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { return super.hashCode(); } @Override public boolean equals(Object obj) { if(obj instanceof TestPersonPk){ TestPersonPk testPersonPk = (TestPersonPk) obj; if(testPersonPk.getId().equals(this.getId()) && testPersonPk.getName().equals(this.getName())){ return true; } } return false; } }
创建表后:
查看创建表的语句:show create table testperson; 可以看到
CREATE TABLE `testperson` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`adress` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`,`name`)
)
第二种:使用 @EmbeddedId 注解
import java.io.Serializable; import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity public class TestPerson implements Serializable{ private static final long serialVersionUID = 1L; private String password; private String email; private String adress; @EmbeddedId private TestPersonPk testPersonPk; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } public TestPersonPk getTestPersonPk() { return testPersonPk; } public void setTestPersonPk(TestPersonPk testPersonPk) { this.testPersonPk = testPersonPk; } }
import java.io.Serializable; public class TestPersonPk implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { return super.hashCode(); } @Override public boolean equals(Object obj) { if(obj instanceof TestPersonPk){ TestPersonPk testPersonPk = (TestPersonPk) obj; if(testPersonPk.getId().equals(this.getId()) && testPersonPk.getName().equals(this.getName())){ return true; } } return false; } }
创建结果和第一种一样
第三种:@IdClass(XXX.class)注解
import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.IdClass; @Entity @IdClass(TestPersonPk.class) public class TestPerson implements Serializable{ private static final long serialVersionUID = 1L; private String password; private String email; private String adress; private Integer id; private String name; @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Id public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAdress() { return adress; } public void setAdress(String adress) { this.adress = adress; } }
import java.io.Serializable; public class TestPersonPk implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { return super.hashCode(); } @Override public boolean equals(Object obj) { if(obj instanceof TestPersonPk){ TestPersonPk testPersonPk = (TestPersonPk) obj; if(testPersonPk.getId().equals(this.getId()) && testPersonPk.getName().equals(this.getName())){ return true; } } return false; } }
第三种结果和前两种一样;
注:使用联合主键要重写equals 和hashCode方法;
相关推荐
### Hibernate联合主键详解 #### 1. 定义联合主键 在Hibernate中定义联合主键主要依赖于`<composite-id>`标签。如示例文件所示,`Users`类被设计为具有联合主键,该主键由`name`和`tel`两个字段组成。在`...
在Java持久化框架Hibernate中,联合主键(Composite Key)是一种特殊的数据结构,用于标识数据库表中的一条记录。与单个字段作为主键不同,联合主键由两个或更多个字段共同组成,形成一个唯一的标识。在本教程中,...
在 Hibernate 中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这种主键在数据库设计中常见于需要多个字段唯一标识一条记录的情况。在 Hibernate 中设置联合主键通常需要以下几个步骤: 1. **...
在Java的持久化框架Hibernate中,联合主键(Composite Key)是一种特殊的数据模型设计,用于处理具有多个字段作为主键的实体。联合主键通常在数据表中的某些列共同决定了唯一标识的情况出现。在Hibernate中,有三种...
在Java Hibernate框架中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这在处理一些特定的数据模型时非常有用。本文将详细介绍如何使用Hibernate注解来定义联合主键。 首先,我们需要了解联合...
《Hibernate复合主键配置与使用详解》 在Java开发中,Hibernate作为一款强大的ORM框架,大大简化了数据库操作。然而,当我们面临复杂的数据表结构,尤其是涉及到复合主键时,如何在Hibernate中进行配置和使用就显得...
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射
请更名为 Hibernate复合主键.part2.rar
在某些情况下,单一字段无法唯一标识表中的记录,此时需要多个字段联合起来作为主键。例如,考虑一个学生选课表,可能包含"学生ID"和"课程ID",这两者结合才能唯一确定学生选修的特定课程。 三、Hibernate中复合...
在Hibernate中,实现联合主键可以通过使用`@Embeddable`和`@EmbeddedId`注解。首先,我们需要创建一个包含所有主键字段的类,并使用`@Embeddable`标记。这个类通常会作为其他实体类的属性,用`@EmbeddedId`注解。...
### JPA注解实现联合主键 在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架...
本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...
同时,Hibernate的Criteria API或HQL(Hibernate Query Language)可以帮助进行复杂的数据库查询,包括涉及多表连接的查询,这些查询可能涉及到联合主键和外键的使用。 综上所述,SSH2+JSON的结合提供了强大的后端...
为了提高性能,我们可以使用`fetch="join"`(XML映射)或`@Fetch(FetchMode.JOIN)`(注解)进行联合查询,一次性获取所有关联的数据。 理解并熟练掌握Hibernate的单向一对多关联,能够帮助开发者更高效地处理复杂的...
- 联合主键是多个字段共同构成的主键,可以通过@EmbeddedId和@Embeddable注解实现。 - 复合主键是自动生成的主键,通过@TableGenerator或@IdClass实现。 **8. 异常处理** - Hibernate提供了自己的异常体系,如...
Hibernate实体关系映射
第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 ...三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........
在Hibernate中,这种继承关系也可以被映射到数据库,如单表继承、联合继承和表-per-hierarchy等策略。 12. **延迟加载(Lazy Loading)**:为了提高性能,Hibernate支持属性和关联的延迟加载,即只有在真正需要时才...
Hibernate支持多种关系映射,如一对一、一对多、多对一和多对多,包括集合映射、联合主键映射等,使得复杂的数据关系得以轻松管理。 10. **实体生命周期** Hibernate管理着对象的生命周期,包括初始化、持久化、...