一、基于外键的双向1对1

  • 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素。为many-to-one元素增加unique=“true” 属性来表示为1-1关联

    另一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段

1.实体类

部门类(Department .java)

public class Department {

    private Integer dId;
private String dName; private Manager manager;
//忽略getter和setter方法
...
}

管理者类(Manager .java)

public class Manager {

    private Integer mId;
private String mName; private Department department;
//忽略getter和setter方法
...
}

2.映射文件

Department.hbm.xml

    <!-- 基于外键的一对一映射,该映射与多对一实质相同,是多对一关联的一个特例,外键可以放到任意一端,
在存放外键的一端使用<Many-to-one>元素,并在该元素中添加unique属性,且设置值true,表示多的一方也必须唯一
在另一端使用<one-to-one>元素。
-->
<many-to-one name="manager" class="Manager"
column="M_ID" unique="true">
</many-to-one>

Manager.hbm.xml

<!-- 没有外键的一端在对应的数据表中已经有外键了,当前持久化类使用one-to-one进行映射
property-ref:指定使用被关联的实体主键以外的字段作为关联字段
-->
<one-to-one name="department"
class="com.withXml.bothOneToOne.entity.
withForeignKey.Department"
property-ref="manager">
</one-to-one>

3.CRUD测试

    /**
* 保存操作
*/
@Test
public void testOneToOneSave(){
//新建部门对象
Department department = new Department();
department.setdName("财务部"); //新建管理者对象
Manager manager = new Manager();
manager.setmName("张铭"); //设定关联关系
department.setManager(manager);
manager.setDepartment(department); //执行保存,先保存没有外键列的对象,这样就会减少update语句,即先保存manage后保存department
session.save(manager);
session.save(department); } /**
* 查询操作
*/
@Test
public void testOneToOneGet(){
//默认情况下,对关联属性使用懒加载,所以会出现懒加载异常
Department department = (Department) session.get(Department.class, 1);
System.out.println(department.getdName()); //出现懒加载异常
// session.close();
// Manager managerName = department.getManager();
//无异常,仅仅是显示对象的类型
// System.out.println(managerName.getClass());
//有异常,使用到了对象的属性
// System.out.println(managerName.getmName()); //
Manager managerName = department.getManager();
System.out.println(managerName.getmName());
} /**
* 查询操作
*/
@Test
public void testOneToOneGet2(){
//在查询没有外键的一端对象时,使用左外连接一并查出其关联的对象,并已经初始化
Manager manager = (Manager) session.get(Manager.class, 1);
System.out.println(manager.getmName());
}

Hibernate(11)_基于外键的双向1对1的更多相关文章

  1. Hibernate(12)_基于主键的双向1对1

    一.基于主键的双向1对1 1.介绍: 基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键. <p ...

  2. Hibernate关系映射(二) 基于外键的双向一对一

    基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...

  3. Hibernate 基于外键的双向一对一关联映射

    之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...

  4. java之hibernate之基于外键的双向一对一关联映射

    这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements ...

  5. Hibernate学习(二补充)关系映射----基于外键的双向一对一

    刚刚写的是基于外键的单向一对一.  那么双向一对一就是在单向一对一的基础上稍微改动就可以了. account.java和account.hbm.xml都不用变动  只要我们小小的变动address.j ...

  6. 注解:【基于外键的】Hibernate双向1->1关联

    Person与Address关联:双向1->1,[基于外键的]. #主表不应该控制关联关系.(否则会导致生成额外的update语句,从而导致性能下降), #因此主表对应的实体中使用@OneToO ...

  7. 注解:【基于外键的】Hibernate单向1->1关联

    Person与Address关联:单向1->1,[基于外键的] Person.java package org.crazyit.app.domain; import javax.persiste ...

  8. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

  9. Hibernate之基于外键映射的一对一(1-1)关联关系

    1.对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true"属性来表示为1 ...

随机推荐

  1. LeetCode-450 二叉搜索树删除一个节点

    二叉搜索树 建树 删除节点,三种情况,递归处理.左右子树都存在,两种方法,一种找到左子树最大节点,赋值后递归删除.找右子树最小同理 class Solution { public: TreeNode* ...

  2. 【转】WPF中的窗口的生命周期

    原文地址:http://www.cnblogs.com/Jennifer/articles/1997763.html WPF中的窗口的生命周期 WPF中所有窗口的基类型都是System.Windows ...

  3. Codeforces 980E The Number Games 贪心 倍增表

    原文链接https://www.cnblogs.com/zhouzhendong/p/9074226.html 题目传送门 - Codeforces 980E 题意 $\rm Codeforces$ ...

  4. day 36 网络编程终结内容

    今日概要: 1 gevent模块 协程:单线程下实现并发(并发指的是看起来同时运行,实现方式:切换+保存状态) 遇到IO切换到其他任务去执行,这种切换才能提高效率 gevent模块 1.切换+保存状态 ...

  5. Python traceback 模块,追踪错误

    Python traceback 模块,追踪错误 import traceback try: your code except: traceback.print_exc()

  6. Activity的启动

    --摘自<android插件化开发指南> 1.AMS管理着四大组件 2.为什么Hook不能在AMS那边?因为AMS属于android系统,android系统可以被Hook,那就是病毒了.四 ...

  7. 多媒体开发(8):调试FFmpeg

    编译FFmpeg得到二进制文件,之后就是对二进制库的调用,这时FFmpeg就像一个黑盒子.作为程序员,难道不想研究一下FFmpeg的具体实现?比如是怎么拿到歌曲信息的.怎么解码的.怎么推流的,等等. ...

  8. web前端知识大纲:系列三 html篇

    web前端庞大而复杂的知识体系的组成:html.css和 javascript 三.HTML 1.BOM BOM 是 Browser Object Model的缩写,即浏览器对象模型,当一个浏览器页面 ...

  9. bzoj3033: 太鼓达人 欧拉路径

    题目链接 bzoj3033: 太鼓达人 题解 对于k-1位点,k位二进制位边,将点的转移连起来 每个点的入度和出度相等并且全部是偶点 只需要在这个图中找字典序最小的欧拉回路 可以贪心地找字典序较小的边 ...

  10. ES6基础语法

    1. 什么是ECMAScript ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association ...