在Hibernate 关系映射中一对一是比较常见也常用的一种,一对一的关系映射类型中又可分为:一对一外键单向映射、一对一外键双向映射、一对一主键单向映射和一对一主键双向映射。

下面就简单的说下自己对这几种映射的理解:

一对一外键单向映射,既然是外键那么映射关系可以理解为是由添加外键的一端来维护的,这里我们暂时称之为“主动维护的一端”(下面简称“主”),那么另外一个类暂时称之为“被维护一端”(下面简称“被”)。主动维护的一端需要额外的添加外键来主动维护这种关系,“主”端生成外键的时候要参照“被”端的主键,也就是说“主”外键依赖于“被”端主键。

那么只需要在主.hbm.xml 的配置文件中添加一个<many-to-one  name="被在主里面定义的字段"   unique="true" />的标签来指向“被”端就可以了,而“被”.hbm.xml不需要添加额外的标签。这里在many-to-one标签中要特别指定unique="true" 属性,这个其实就是多对一关系映射中的一种特殊情况。 多对一的映射关系后面再介绍。

找个实例拿过来看看: “主”端  (数据库表中会生成 id 、name、idCard 三个相应的字段)

<class name="Person" table="t_person"><id name="id"><!--native 主键生成策略 --><generator class="native"/></id><property name="name"/><!-- (可选): 使用DDL为外键字段生成一个唯一约束。此外,这也可以用作property-ref 的目标属性。这使关联同时具有 一对一的效果。 --><many-to-one name="idCard" unique="true"/></class>

“被”端:

<class name="IdCard" table="t_idcard"><id name="id"><!-- 主键生成策略 --><generator class="native"/></id><property name="cardNo"/></class>

一对一外键双向映射,这种关系映射在配置的时候其实就是一对一外键单向配置的基础上再在“被”的一端添加一个<one-to-one name="在被端POJO里面定义的主类型的变量名称"/>

双向的,“主”端和上面的一样;“被“的一端变为: (数据库表t_idcard中生成两个字段,id 、carNo),IdCard 的POJO中也声明了person 但数据库表中不会生成相应的字段。

 <class name="IdCard" table="t_idcard"><id name="id"><generator class="native"/></id>
<property name="cardNo"/><one-to-one name="person" property-ref="idCard"/></class>

一对一主键单向映射,主键的话就不用在数据库表中添加额外的字段了,这里主动维护的一端的主键的生成要依赖于被维护端的主键。这里在主动维护的一端的*hbm.xml文件中定义主键的生成策略为forergn  例如:

"主"端:

<hibernate-mapping><calss name="Person" table="t_person"><id name="id"><generator calss="foreign"><param name="property">idCard</param>// 主键生成参照的哪个外键的名称,这里要和下面的<one-to-one name="idCard"/>标签的属性保持一致。<generator></id><property name="name"/><one-to-one name="idCard" constrained="true"/>// <one-to-one>标签来维护映射关系。constrained 表示是否支持级联关系 默认为false  这里设置为true ,在生成
                                                 // 两个对象间的关系的时候就不用关心先后顺序
</class>
</hibernate-mapping>

“被”端:  基本上和前面的一样,单向的时候基本上不会添加用于映射的标签。

<hibernate-mapping><calss name="IdCard"  table="t_idcard"><id name="id"><generator calss="uuid.hex"/></id><property name="cardNo"/></calss>
<hibernate-mapping>

一对一主键双向映射: 双向的时候只是在单向映射的基础上在“被”端添加一个<one-to-one>的标签来设置从被的一端维护这种关系。

“主”端和上面是一样的,看“被”端

<hibernate-mapping><calss name="IdCard" table="t_idcard"><id name="id"><generator calss="native"></id><property name="cardNo"/><one-to-one name="person"/></class></hibernate-mapping>

一对一几种关系映射先写到这,下一篇总结多对一 和一对多映射。

Hibernate 一对一关系映射总结篇相关推荐

  1. Java程序员从笨鸟到菜鸟之(五十八)细谈Hibernate(九)hibernate一对一关系映射...

    一对一关系映射即为关系双方都含有对方一个引用,其实在生活中一对一关系也很常见,比如人和×××,学生和学号等,都是一对一的关系映射,一对一映射分为单向的和双向的,没种关系映射又可以分为主键关联映射,唯一 ...

  2. hibernate中一对一关系映射

    这篇文章讲述的是hibernate中一对一关系映射,如有错误或者不当之处还望各位大神批评指正. 一对一映射(外键关联) 目标 假设一个人对应养一只狗,一只狗只能由一个人来养,完成一对一相关操作. 类编 ...

  3. Hibernate对象关系映射详解之一对多关系映射

    Hibernate对象关系映射详解之"一对多"关系映射 之前学习Hibernate框架的时候,对这七大关系映射一直是云里雾里的,虽然可以仿照写出代码,但是不能独立编写出来.鉴于工作 ...

  4. ORM进阶之Hibernate中关系映射

    ORM进阶之 ORM简介 ORM进阶之Hibernate简介及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 ORM进阶之Hibernate中一对 ...

  5. 问题记录:EntityFramework 一对一关系映射

    EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher {public int Id { get; set; }p ...

  6. 【Hibernate】Hibernate实体关系映射——主键相同的一对一关系

    主键相同的一对一关系 由于两个实体类是一对一的关系,因此可设置两个实体类使用相同的主键.反过来,具有相同主键的实体被视为一对一的关系.这样两个表就省掉了外键关联. 以客户地址管理为例学习主键相同的一对 ...

  7. 【Hibernate】Hibernate实体关系映射——双边的一对一关系

    凡是配置实体间关系的标签,例如:@ManyToOne.@OneToMany.@ManyToMany.@OneToOne等,都可以配置mappedBy属性.mappedBy表示该属性是反向属性,与另一边 ...

  8. ef多条件映射_Hibernate一对一关系映射

    1.需求:新增一个用户时,同时增加身份证信息. 2.数据库设计: 3.说明:以上是基于外键的映射关系,将用户表主键 user_id作为身份证表的外键字段关联起来,作为单独的外键列,保存在数据库中,类似 ...

  9. hibernate继承关系映射方法(一)--共享一张表

    对于如下关系: Person.java package com.hust.PO;public class Person {private Integer id;private String name; ...

最新文章

  1. 两大顶级 AI 算法一起开源!Nature、Science 齐发 Alphafold2 相关重磅,双厨狂喜~...
  2. OpenCV4中的非典型深度学习模型
  3. 5G 对无线通讯芯片产业链的影响
  4. SmartRules让MindManager的交互图变得更加智能
  5. Android之Fragment使用简介
  6. Redis为什么使用单进程单线程方式也这么快
  7. 小白入门PyTorch | 第一篇:什么是PyTorch?
  8. 为什么我们做分布式要用 Redis ?
  9. 阿里NIPS 2017论文解读:如何降低TensorFlow训练的显存消耗?
  10. 【Numpy】array操作总结
  11. java的tcp实时接收json格式报文_tcp - 如何使用带有rsocket Java的TcpClientTransport将自定义数据格式转换为JSON - 堆栈内存溢出...
  12. android折叠listview,android – 如何在listview中展开和折叠项目
  13. 小汤学编程之JavaEE学习day04——EL表达式、JSTL
  14. java 去重复值 按位_详解Java的按位操作符
  15. 在Eclipse中使用SDK中的@hide函数
  16. Leetcode639. Decode Ways II
  17. Flash桌球游戏开发
  18. IPQ8074板载12天线符合802.11ax标准双频工业级嵌入式无线AP主板
  19. bootstrap table表格 设置背景颜色 设置字体颜色cellStyle 显示隐藏列(更换工具栏图标) 固定列 导出(兼容全部导出时(all)) 调整列宽 日期格式化1970-01-01bug
  20. Arbitrary Style Transfer with Deep Feature Reshuffle

热门文章

  1. workflow 添加html,为alfred编写workflow
  2. 全面理解 Unity UI 系统
  3. 课后作业——Day10
  4. matlab关于年月日的程序,自己编的小程序!Matlab日期计算
  5. Linux 判断文件或文件夹是否存在
  6. 判断file是否存在的方法
  7. SWOT分析和PEST分析
  8. “无剑胜有剑”软件大师之路的一点探索
  9. 谁能拒绝浪漫的2023元旦跨年代码?
  10. zTree(二)树状图下拉框