²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号)

²  有两种策略可以实现一对一的关联映射

  • 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。
  • 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系。

实例场景:人<—-> 身份证号(Person<->IdCard)双向:互相持有对方的引用

IdCard实体类:

  1. public class IdCard {
  2.  
  3. private int id;
  4.  
  5. private String cardNo;
  6.  
  7. private Person person; //持有Person对象的引用
  8.  
  9. public int getId() {
  10.  
  11. return id;
  12.  
  13. }
  14.  
  15. public void setId(int id) {
  16.  
  17. this.id = id;
  18.  
  19. }
  20.  
  21. public String getCardNo() {
  22.  
  23. return cardNo;
  24.  
  25. }
  26.  
  27. public void setCardNo(String cardNo) {
  28.  
  29. this.cardNo = cardNo;
  30.  
  31. }
  32.  
  33. public Person getPerson() {
  34.  
  35. return person;
  36.  
  37. }
  38.  
  39. public void setPerson(Person person) {
  40.  
  41. this.person = person;
  42.  
  43. }
  44.  
  45. }

Person实体类:

  1. public class Person {
  2.  
  3. private int id;
  4.  
  5. private String name;
  6.  
  7. private IdCard idCard;//持有IdCard对象的引用
  8.  
  9. public int getId() {
  10.  
  11. return id;
  12.  
  13. }
  14.  
  15. public void setId(int id) {
  16.  
  17. this.id = id;
  18.  
  19. }
  20.  
  21. public String getName() {
  22.  
  23. return name;
  24.  
  25. }
  26.  
  27. public void setName(String name) {
  28.  
  29. this.name = name;
  30.  
  31. }
  32.  
  33. public IdCard getIdCard() {
  34.  
  35. return idCard;
  36.  
  37. }
  38.  
  39. public void setIdCard(IdCard idCard) {
  40.  
  41. this.idCard = idCard;
  42.  
  43. }
  44.  
  45. }

IdCard实体类映射文件:

  1. <hibernate-mapping>
  2.  
  3. <class name="com.wjt276.hibernate.IdCard" table="t_idcard">
  4.  
  5. <id name="id" column="id">
  6.  
  7. <generator class="native"/>
  8.  
  9. </id>
  10.  
  11. <property name="cardNo"/>
  12.  
  13. <!—
  14.  
  15. one-to-one标签的含义:指示hibernate怎么加载它的关联对象(这里的关联对象为person),默认根据主键加载
  16.  
  17. -->
  18.  
  19. <one-to-one name="person"/>
  20.  
  21. </class>
  22.  
  23. </hibernate-mapping>

Person实体类映射文件不变:

  1. <hibernate-mapping>
  2.  
  3. <class name="com.wjt276.hibernate.Person" table="t_person">
  4.  
  5. <id name="id" column="id">
  6.  
  7. <!--
  8.  
  9. 因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略
  10.  
  11. foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。
  12.  
  13. 再使用元素<param>的属性值指定相关联对象(这里Person相关联的对象为idCard,则标识符为idCard的id)为了能够在 加载person数据同时加载IdCard数据,所以需要使用一个标签<one-to-one>来设置这个功能。
  14.  
  15. -->
  16.  
  17. <generator class="foreign">
  18.  
  19. <!-- 元素<param>属性name的值是固定为property -->
  20.  
  21. <param name="property">idCard</param>
  22.  
  23. </generator>
  24.  
  25. </id>
  26.  
  27. <property name="name"/>
  28.  
  29. <!-- <one-to-one>标签
  30.  
  31. 表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。
  32.  
  33. 默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。)
  34.  
  35. 我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true"
  36.  
  37. -->
  38.  
  39. <one-to-one name="idCard" constrained="true"/>
  40.  
  41. </class>
  42.  
  43. </hibernate-mapping>

导出至数据库表生成SQL语句:

create table t_idcard (id integer not null auto_increment, cardNo varchar(255), primary key (id))

create table t_person (id integer not null, name varchar(255), primary key (id))

alter table t_person add index FK785BED805248EF3 (id), add constraint FK785BED805248EF3 foreign key (id) references t_idcard (id)

注意:此双向的SQL语句,与单向的SQL语句没有任何变化,也就是说数据库中的表单向双向没有任何区别。<one-to-one>的单向、双向对数据库表没有影响,只是告诉Hibernate如何加载数据对象。

一对一 主键关联映射加载数据测试—双向:

  1. session = HibernateUtils.getSession();
  2.  
  3. tx = session.beginTransaction();
  4.  
  5. IdCard idCard = (IdCard)session.load(IdCard.class, 1);
  6.  
  7. System.out.println("idcard.cardNo=" + idCard.getCardNo());
  8.  
  9. System.out.println("idcard.person.name=" + idCard.getPerson().getName());
  10.  
  11. // 提交事务
  12.  
  13. tx.commit();

加载数据时,输出SQL语句:

Hibernate: select idcard0_.id as id1_1_, idcard0_.cardNo as cardNo1_1_, person1_.id as id0_0_, person1_.name as name0_0_ from t_idcard idcard0_ left outer join t_person person1_ on idcard0_.id=person1_.id where idcard0_.id=?

总结:

需要在idcard映射文件中加入<one-to-one>标签指向hibernate,指示hibernate如何加载person(默认根据主键加载。)

010一对一 主键关联映射_双向(one-to-one)的更多相关文章

  1. 009一对一 主键关联映射_单向(one-to-one)

    009一对一  主键关联映射_单向(one-to-one) ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...

  2. 012一对一 唯一外键关联映射_双向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  3. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  4. Hibernate关联映射1:一对一主键关联

    2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...

  5. 011一对一 唯一外键关联映射_单向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  6. Hibernate5.2之一对一主键关联(四)

                                                      Hibernate5.2之一对一主键关联(四) 一.简介 一对一关联关系分为两种:a.主键关联:b. ...

  7. Hibernate注解:一对一主键关联

    情形:两个表,my_site和my_site_company,通过主键site_id唯一关联.my_site的主键是自动增加,my_site_company的主键依赖于my_site. # # Sou ...

  8. java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

      hibernate.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE h ...

  9. hibernate一对一主键双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. PHP中的for循环

    循环 循环是操作某一个功能(执行某段代码). ①循环四要素: a 循环初始值 b 循环的条件 c 循环状态 d 循环体 ②for循环 a 穷举:把所有的可能性的都一一列出来. b 迭代:每次循环都会把 ...

  2. 简聊iOS支付集成(支付宝和微信支付)

    一.支付集成是什么 1.现在大部分app都有快捷支付功能,支付集成将第三方支付平台集成到自己的项目中,能够完成自己项目中的支付功能, 二.支付集成的使用 <1>.支付宝: 下载SDK和De ...

  3. shell脚本练习题

    下面列出了几个linux学习中的shell脚本题目 1.九九乘法表 #!/bin/bash echo "九九乘法表" # 注意((之间不能有空格.加减乘除的格式.还有转义字符\*. ...

  4. 体验VS2017的Live Unit Testing

    相对于传统的Unit Test,VS2017 带来了一个新的功能,叫Live Unit Testing,从字面意思理解就是实时单元测试,在实际的使用中,这个功能就是可以在编写代码的时候进行实时的bac ...

  5. Java中ArrayList,Vector,LinkedList,HashMap,HashTable,HashSet对比及总结

    1.所有的集合的父类都是Collection的接口 2.Set List Map 区别 A  在Set里面:无法添加元素的顺序,所以Set里面的元素不能重复 B  在List中:有索引号,类似于数组, ...

  6. ZOJ 3195 Design the city 题解

    这个题目大意是: 有N个城市,编号为0~N-1,给定N-1条无向带权边,Q个询问,每个询问求三个城市连起来的最小权值. 多组数据 每组数据  1 < N < 50000  1 < Q ...

  7. Sql server DATEADD日期函数的使用

    DATEADD日期函数 DATEADD() 函数在日期中添加或减去指定的时间间隔. 日:在当前日期上加两天 , ,'2014-12-30') 月:在当前日期上加两个月 , , 年:在当前日期上加两年 ...

  8. Android系统--输入系统(六)模拟输入驱动程序

    Android系统--输入系统(六)模拟输入驱动程序 1. 回顾输入子系统 简单字符设备驱动:应用程序通过调用驱动所实现的函数使能硬件. 输入子系统:由于有多个应用程序使用输入子系统,故肯定使用的是早 ...

  9. T-SQL编程中的异常处理-异常捕获(catch)与抛出异常(throw)

    本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出,本文简单介绍异常捕获与异 ...

  10. css 画出三角形

    技术分享不一定行文累赘 这里说说最简洁的 css 画出三角形 display: inline-block; border: 10px dashed transparent; border-left: ...