Hibernate 一对一关联关系
双向一对一关联关系:
域模型:
例如,部门只有一个部门经理,一个经理也只能管理一个部门。即,Department 中有一个Manager的引用,Manager 中又有一个Department 的引用。
关系数据模型:
按照主键映射: 这种方式跟 多对一关联关系非常相似,比如department 表有一个外键 MANAGER_ID 指向manager 表的ID, 此时Department 和 Manager 对应的这两张表是多对一的关联关系,为了实现一对一的关联关系,只要给 外键 MANAGER_ID 加上一个唯一约束,则可以实现一对一关联关系。
需要注意的问题:
①、保存:建议先保存没有外键列的那一端的对象。
②、查询:默认情况下使用懒加载异常。
③、没有外键的一端需要使用 one-to-one 元素,该元素使用property-ref 属性指定使用 被关联实体主键以外的字段作为关联字段。
④、在查询没有外键关联的一端对象的时候,使用左外连接一并查询出其关联的对象,并进行初始化。
也就是说:把懒加载属性设为true 的时候,查询 Manager 会一并把Department 查询出来,但是查询Department 并不会把Manager对象查询出来。
按照外键映射:
拥有外键的一端生成主键的方式要注意,不是使用 native ,而是使用 foreign
示例:
实体类按照主键映射的一样,区别在于映射文件。这里将映射文件代码贴出来。
Department类的映射文件
<class name="com.zcd.hibernate.oneToOnePrimary.Department" table="DEPARTMENT"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="foreign" > <!-- 生成主键的方式 --><param name="property">manager</param> <!-- 还要指定根据。。。 --></generator></id><property name="name" type="java.lang.String"><column name="NAME" /></property><one-to-one name="manager" class="com.zcd.hibernate.oneToOnePrimary.Manager" constrained="true"></one-to-one></class>
Manager的映射文件
<class name="com.zcd.hibernate.oneToOnePrimary.Manager" table="MANAGER"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="native" /></id><property name="name" type="java.lang.String"><column name="NAME" /></property><one-to-one name="department" class="com.zcd.hibernate.oneToOnePrimary.Department"></one-to-one></class>
不管先插入哪一个对象,都会先发送被拿主键来作为他人外键的那个对象的插入SQL语句,比如这里不管先插入Department 还是Manager,都会先发送插入Manager 的SQL语句。
有一个疑问:下面的代码为什么会保存两次 Manager 对象呢?
@Testpublic void testDepartmentAndManager(){Department department = new Department();department.setName("研发部");Manager manager = new Manager();manager.setName("BB");department.setManager(manager);manager.setDepartment(department);oneToOnePrimaryService.saveDepartment(department);oneToOnePrimaryService.saveManager(manager);}
Hibernate 一对一关联关系,使用外键映射和使用主键映射的区别:
目前发现的一点区别如下,以后发现了在进行添加。
外键映射 | 主键映射 | |
生成主键方式 |
使用native <generator class="native" /> |
使用foreign还有 <generator class="foreign" ><param name="property">company</param> </generator> |
使用many-to-one 加上unique属性,另一端不需要修改,按自动生成的使用 | 使用one-to-one,加上contrained="true"属性,另一端不需要修改,按自动生成的使用 |
转载于:https://www.cnblogs.com/GooPolaris/p/7919416.html
Hibernate 一对一关联关系相关推荐
- Hibernate关联关系映射之一对一关联关系
人和身份证之间就是一个典型的一对一关联关系.实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式 首先看他们的实体类 Person类 ? 1 2 3 4 5 ...
- Hibernate一对一关联映射配置
一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1)保 ...
- Hibernate 实体关联关系映射----总结
http://lavasoft.blog.51cto.com/62575/39398 Hibernate 实体关联关系映射----总结 花了三天的业余时间,终于写完了Hibernate关联关系映射的所 ...
- hibernate.一对一关联
实体类关系 一对一 一对多 多对一 多对多 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分 ...
- hibernate 一对一(One-to-One)
一对一(one-to-one)实例(Person-IdCard) 一对一的关系在数据库中表示为主外关系.例如.人和身份证的关系.每个人都对应一个身份证号.我们应该两个表.一个是关于人信息的表(Pers ...
- Hibernate 一对一外键单向关联
[align=center][size=medium]Hibernate 一对一外键单向关联[/size][/align] 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的.唯一的不同就是单向 ...
- Hibernate一对一映射示例注释
Hibernate一对一映射示例注释 今天我们将研究Hibernate中的一对一映射.我们将使用Annotation和XML配置来研究Hibernate One To One Mapping示例. 目 ...
- php一对一模型关联,通过实例学习Laravel模型中的一对一关联关系
通过实例学习Laravel模型中的一对一关联关系 一.前言 Laravel遵循[约定优于配置]的原则.PHP开发者只需要遵循Laravel框架的原则,就能减少大量的工作,这便是Laravel的魅力之一 ...
- hibernate一对一主键唯一外键关联(一)
1.新建工程项目hibernate_one2one_ufk_1,添加hibernate所需Jar包和数据库驱动Jar包. 2.编写工具类HibernateUtils.java和ExportDB.jav ...
最新文章
- android系统应用程序,Android系统应用程序基本概念解读
- 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】...
- android 开源 示波器,上个老外的开源虚拟示波器
- seata分布式事务协调管理器是如何实现的
- ILS-LDA基于迭代最小二乘的字典学习算法的学习
- Range的学习笔记
- 关于eclipse中引入项目报错或者没有JRE System Library问题(jre报错)或者jre1.7(8)改为jre1.8(7)等问题...
- XenCenter开启虚机提示VDI不可用
- firework软件linux下,Linux 下的网页三剑客 都是免费的啊 (*^__^*)
- usb加密狗破解原理及方法介绍
- ubuntu16.04 lidar_align实现三维激光雷达和Imu联合标定
- 移动硬盘打不开提示格式化怎么办?
- 前端vue生成二维码
- [bzoj2827]千山鸟飞绝【splay】
- 20款免费备份文件软件
- 「维基解密」:西游记死亡人数
- POI最新版本 4.1.2 操作 Excel
- Fractions (水)
- vue中关于$emit及propos的用法
- 思科2018校招硬件测试笔试试题及答案