《Hibernate学习笔记三》:联合主键的映射
来源:互联网 发布:java相关文献 编辑:程序博客网 时间:2024/06/02 04:55
《Hibernate学习笔记三》:联合主键的映射
就如在前面所举的例子一样,是使用的id作为唯一的主键,一般情况下我们也只使用唯一的一个属性作为主键,但是在实际中,我们可能会遇到几个属性作为主键的情况,因此,在本篇博文中,就来介绍下,联合主键的映射关系应该如何来做??
联合主键的映射有两种方式来进行实现。
1、使用映射文件 XXX.hbm.xml
2、使用Annotation
Hibernate首先需要使用联合主键的实体类必须实现Serializable接口,即为了使序列能够被序列化进行传输,并要求实体类重写equals、hashCode这两个方法,用这两个方法来确保联合主键的唯一性。
下面具体来看一个例子。
先看第一种实现方式。
第一种:使用映射文件XXX.hbm.xml来实现联合主键的映射
a、实体类 Student
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
上面的private StudentPK pk;就是我们的联合主键,联合主键我们封装在了一个类StudentPK中,也可以之间将联合主键的属性不进行封装,直接写在实体类Student。
b、联合主键类 StudentPK
这个就是对联合主键id和name进行了封装,即使得StudentPK为联合主键类,这个类要实现Serializable接口,并需要重写equals和hashCode方法。来实现组合的标识符的相等判断
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
c、联合主键的映射文件 Student.hbm.xml
在前面的例子中我们见到过一个属性作为主键的映射文件如何来写,下面就是几个属性作为主键的映射文件应该如何来写。
在官方文档上有这样一句话:
定义可以访问旧式的多主键数据。 我们强烈不建议使用这种方式。
文档上面给出的composite-id的一般格式如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
在我们的例子中完整的映射文件内容如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
d、配置文件 hibernate.cfg.xml
配置文件内容如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
e、测试类 StudentTest
测试类代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
运行结果在数据库中的反应如下:
这样我们就完成了联合主键的映射。
第二种:使用Annotation来实现联合主键的映射
在文档中,说明了定义组合主键的几张语法如下:
1、将组件类注解为@Embeddable,并将组件的属性注解为@Id。
2、将组件的属性注解为@EmbeddedId
3、将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id。
下面对这三种方式分别举例来进行介绍。
1、将组件类注解为@Embeddable,并将组件的属性注解为@Id。
第一步:将组件类注解为@Embeddable
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
第二步:将组件的属性注解为@Id
这里要特别注意的是:并不是在TeacherPK这个组合主键类中把id和name用注解@Id修饰,而是在实体类Teacher类中将TeacherPK组件用@Id来进行注释
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
测试类
配置文件hibernate.cfg.xml和上面的一样,这里就不再贴代码,而测试类的代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
在控制台输出的建表数据如下:
因此,利用将组件类注解为@Embeddable,并将组件的属性注解为@Id。这种方式我们就成功的对联合主键进行了映射。
2、将组件的属性注解为@EmbeddedId
这种方式比第一种方式更加简单,直接不需要将组件类TeacherPK用注解为@Embeddable,而是直接用@EmbeddedId来注解Teacher类中的主键属性,如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
主键类TeacherPK不需要任何的注解。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
3、将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id。
实体类Teacher
将实体类Teacher注解为@IDClass,并将实体中所有属性主键的属性都注解为@Id,而主键类TeacherPK则不用任何注解来进行修饰。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
主键类代码如下:
不用任何注解来进行修饰。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
测试类代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
hibernate.cfg.xml文件内容与上面介绍的一样。
运行程序后在数据库中Teacher表结构如下:
以上就是第三种注解方式来完成联合主键的映射。
from: http://blog.csdn.net/u010412719/article/details/51275744
- 《Hibernate学习笔记三》:联合主键的映射
- 《Hibernate学习笔记三》:联合主键的映射
- Hibernate注解映射联合主键的三种主要方式
- Hibernate注解映射联合主键的三种主要方式
- hibernate笔记-009-联合主键一对一映射
- Hibernate中联合主键映射学习
- Hibernate学习笔记(三)----ID生成策略、联合主键
- Hibernate映射联合主键
- Hibernate联合主键映射
- hibernate映射联合主键
- Hibernate联合主键映射
- Hibernate联合主键映射
- Hibernate联合主键映射
- Hibernate联合主键映射
- hibernate联合主键映射
- Hibernate联合主键映射
- Hibernate联合主键映射
- Hibernate 映射视图的联合主键
- c++友元类声明及其调用
- linux下ftp命令调用外部变量传送文件
- javawebday10(xpath查询节点 dom4j crud)
- 设计模式之观察者模式Observer
- android 屏幕适配方案第二版
- 《Hibernate学习笔记三》:联合主键的映射
- 设计模式——代理模式
- TypeError: object() takes no parameters
- 高德地图基本显示
- Kafka学习整理三(borker(0.9.0及0.10.0)配置)
- 本地方法栈及native方法
- 嵌入式Linux初始化QAT失败 及 问题 解决
- 微信开发最重要的一步(服务器配置)
- 侧滑