双向一对一关联关系:

域模型:

  例如,部门只有一个部门经理,一个经理也只能管理一个部门。即,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. harbor 仓库搭建

    一,介绍 Harbor是一个用于存储Docker镜像的企业级Registry服务. Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry ...

  2. 转-------CNN图像相似度匹配 2-channel network

    基于2-channel  network的图片相似度判别 原文地址:http://blog.csdn.net/hjimce/article/details/50098483 作者:hjimce 一.相 ...

  3. Go语言下载网络图片或文件

    最近闲来无事, 于是就简单学习了下Go语言的基本的用法.由于实践才是最快的学习方法,所以这里就以下载网络图片或文件入手来学习Go语言 文件下载到本地,通常的思路就是先获得网络文件的 输入流 以及本地文 ...

  4. [Activator-HelloAkka] Create our Actors

    So far we have defined our Actor and its messages. Now let's create an instance of this actor. In Ak ...

  5. [實現DDD] 第10章 聚合(1)設計原則

    聚合只是將一些實體(Entity)與值對象(Value Object)聚集起來的對象樹嗎?? 有些途徑可能使我們設計出不正確的聚合模型, 如:可能為了對象組合上的方便而將聚合設計的很大;也可能設計的聚 ...

  6. log4j的AppenderLayout格式符

    %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL. %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd ...

  7. 白话SpringCloud | 第三章:服务注册与发现(Eureka)-下

    前言 上一章节,讲解了在单机模式下的服务注册与发现的相关知识点及简单示例.而在实际生产或者在这种微服务架构的分布式环境中,需要考虑发生故障时,各组件的高可用.而其实高可用,我的简单粗俗理解就是,通过系 ...

  8. Python实现抓取CSDN博客首页文章列表

    1.使用工具: Python3.5 BeautifulSoup 2.抓取网站: csdn首页文章列表 http://blog.csdn.net/ 3.分析网站文章列表代码: 4.实现抓取代码: __a ...

  9. 3、Angular2 Input

    3.理解@input

  10. 分页存储过程ROW_NUMBER() over(order by pid desc)

    分页存储过程 : create proc usp_GetMyPhotos  @pageIndex int,   --当前页码  @pageSize int,   --每页多少条  @pageCount ...