双向一对一关联关系:

域模型:

  例如,部门只有一个部门经理,一个经理也只能管理一个部门。即,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. 获取window.location.href路径参数

    GetQueryString(param) { //param为要获取的参数名 注:获取不到是为null var currentUrl = window.location.href; //获取当前链接 ...

  2. 分享:JAVA和C# 3DES加密解密

    最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byt ...

  3. docker~环境变量到底怎么用

    docker已经用了两年多了,从开始的简单应用到现在的自动化部署,已经越来越感觉到它的威力,今天把Hitchhiker部署完成后,看到了它与.net core项目有个类似的地方,就是对于多环境部署的时 ...

  4. tomcat修改jvm内存

    内存大小:-Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=512m -Djava.awt.headles ...

  5. Jenkins+Postman+Newma+Xmysql之API全自动化测试

    第一章 前期准备:各种安装配置介绍 ①Postman安装及使用 ②Newman 安装及使用 ③Xmysql 安装及使用 ④Jenkins安装及配置 1.postman 安装及使用 1.1.postma ...

  6. pat1011. World Cup Betting (20)

    1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Wit ...

  7. 通过JavaScript动态生成html控件

    示例代码 <html> <head> <meta http-equiv="Content-Type" content="text/html& ...

  8. BJFU 1551 ——delightful world——————【暴搜】

    delightful world 时间限制(C/C++):20000MS/30000MS          运行内存限制:65536KByte总提交:33            测试通过:10 描述 ...

  9. Druid手动创建连接的坑

    环境:druid 1.1.10 今天优化了一天的代码, 老代码手动创建连接,坑 Connection conn = DBUtil.getConnection("d_log_dot_" ...

  10. Aaja.pro 未定义

    问题描述:安装新系统后,将代码迁至新系统,所有用到ajaxpro框架调用ajax方法时均报“xx未定义”的错: 解决问题的过程 : 1.看看你在前台调用的方法的命名空间,方法名和后台的是否对应.在后台 ...