双向一对一关联关系:

域模型:

  例如,部门只有一个部门经理,一个经理也只能管理一个部门。即,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 对象呢?

@Test
public 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"属性,另一端不需要修改,按自动生成的使用

Hibernate 一对一关联关系的更多相关文章

  1. hibernate 一对一关联关系 及其懒加载,总结

    一对一,则有主对象和从对象之区别 若无主对象,则从对象亦无存在之意义. 主对象为person 从对象为idcard <hibernate-mapping package="cn.itc ...

  2. Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A ...

  3. Hibernate映射一对一关联关系

    映射一对一关联 Hibernate提供了两种映射一对一关联关系的方式,分别是按照外键映射和按照主键映射. 下面是员工表和档案信息表(员工和档案表之间的关系是一对一的关系)  档案表(dept) pub ...

  4. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

  5. Hibernate关联关系映射之一对一关联关系

    人和身份证之间就是一个典型的一对一关联关系.实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式 首先看他们的实体类 Person类 ? 1 2 3 4 5 ...

  6. Hibernate —— 映射关联关系

    一.映射多对一关联关系. 1.单向的多对一 (1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户.从 Order 到 Customer 是多对一关联关 ...

  7. Hibernate一对一关联映射配置

    一.一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1 ...

  8. 04.Hibernate一对一关联

        前言:本文主要介绍使用Hibernate映射一对一的关联关系的两种方式:使用外键映射.使用主键映射. 1.数据库表的一对一关联关系     本文根据客户信息表(tb_customer)和地址信 ...

  9. .Hibernate一对一映射与组件映射

    1.按照外键映射(Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射) 实现需要: 创建实体类Users1和Resume1 public class Users1 { p ...

随机推荐

  1. Notepad++编译和运行Java

    首先要让Notepad++编译和运行Java,前提是电脑里已经配置好了Java的环境(这里可以参考我博客里关于Java环境配置的那篇随笔). 在Notepad++上面的选项栏中找到 插件---> ...

  2. 集成 Jenkins 和 TestNG 实现自助式自动化测试平台

    背景介绍 在软件业十分成熟的今天,敏捷(Agile)开发在业界日益流行,而面临的挑战也日益增多,不断变化的用户需求.缩短的开发周期.频繁的部署上线.复杂的产品架构和团队组织,如何继续保证软件的质量是一 ...

  3. PIE SDK彩色空间变换

    1. 算法功能简介 使用彩色空间变换工具可以将三波段红.绿.蓝图像变换到一个特定的彩色空间,并且能从所选彩色空间变换回 RGB.两次变换之间,通过对比度拉伸,可以生成一个色彩增强的彩色合成图像.此外, ...

  4. 第四次 Scrum Meeting

    第四次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/4/8 22:00 30min 大运村1号楼3F 附Github仓库:WEDO 例会照片 工作情况总结(4.8) ...

  5. (Frontend Newbie)Web简史

    前段时间在微博上看到有人问,前端这几年发展这么迅猛,各种新技术.新框架层出不穷,我们究竟怎么学习这些新技术才能跟得上脚步,毕竟精力有限,逐个学习不现实.个人认为,没有太大的必要去追逐那些新潮的技术.原 ...

  6. Eclipse的企业开发时常用快捷键使用、优化配置(博主推荐)

    不多说,直接上干货! 一.简介 eclipse可谓是Java开发界的神器,基本占据了大部分的Java开发市场,而且其官方还对其他语言提供支持,如C++,Ruby,JavaScript等等.为什么使用它 ...

  7. java中static方法的继承性

    首先需要知道的是,java中所有的public实例方法都默认是virtual的,static方法不是virtual的,所以static方法可以被覆盖(new),但不可被重写(override) 1.被 ...

  8. 腾讯蔡晨:十年沉淀,腾讯iOA为企业安全保驾护航

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 背景:5月23-24日,以"焕启"为主题的腾讯"云+未来"峰会再广州召开,广东省各级政府机构领导.海 ...

  9. jqgrid 操作

    1.获取单个id 获取行号,有这种方式: var rowid = $("#gridList").jqGrid("getGridParam", "sel ...

  10. Javascript怎么跳出循环,嵌套循环。

    今天要实现一个功能,在数组a中的每一项,对应数组b中的每一项,如果对应上了就给数组b的checked增加ture属性,如果查找不到就给数组b的checked增加false属性. 如果有哪里写的不对欢迎 ...