1. 简介
    1. 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一、又如一夫一妻制等等。
    2. 记得在Java编程思想上第一句话是“一切皆对象”,生活中的所有事物都是对象,这种一一对应的关系也体现在了对象上,但是在对象上有了些区别这和对象的特性有关系,有了方向性,拿人和身份证来说他们是两个对象,如果是单一方向那么知道了人的信息就能知道身份证信息,相反却得不到。
    1. 从实现角度来分也可以分为两种情况,第一种是共享主键;第二种是唯一外键;这两种都很好理解,我们做的系统也不少了平时我们用的那种就是属于唯一外键约束,共享主键是那其中一个表的主键另一个表来用,两个表使用一个相同的主键来保持两个表中记录一一对应。
  1. 共享主键方式实现
    1. 在维持一对一映射中这种方式用的比较少,可能对于数据库的性能有所提高不需要外键来约束,我们拿人和身份证来说说这种方式怎么实现一对一映射,下面是这两个类的对应关系。
    2. 类图
    1. Person实体类
      1. package com.bjpowernode.hibernate;
        /**
        * a person information
        * @author LLS
        *
        */
        public class Person {
        //class's properties
        private int id;
        private String name;
        private Card card;
        //getter and setter method
        public Card getCard() {
        return card;
        }
        public void setCard(Card card) {
        this.card = card;
        }
        public int getId() {
        return id;
        }
        public void setId(int id) {
        this.id = id;
        }
        public String getName() {
        return name;
        }
        public void setName(String name) {
        this.name = name;
        }
        }
    1. Card实体类
      1. package com.bjpowernode.hibernate;
        /**
        * a identity card
        * @author LLS
        *
        */
        public class Card {
        //class properties
        private int id;
        private String cardNo;
        //getter and setter method
        public int getId() {
        return id;
        }
        public void setId(int id) {
        this.id = id;
        }
        public String getCardNo() {
        return cardNo;
        }
        public void setCardNo(String cardNo) {
        this.cardNo = cardNo;
        } }
    1. Person映射文件
      1. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        <class name="com.bjpowernode.hibernate.Person" table="t_person">
        <id name="id">
        <!-- 采用foregin策略,它会取得关联对象的标识 -->
        <generator class="foreign">
        <!-- property只关联对象 -->
        <param name="property">card</param>
        </generator>
        </id>
        <property name="name"></property>
        <!--
        one-to-one指示Hibernate如何加载其关联对象,默认根据主键加载,也就是拿到了关联字段
        根据对端的主键来加载。
        constrained="true"表示当前主键还是一个外键,也就是会生成外键约束语句,当前主键对引用表来说是一个
        外键,但对当前表是主键
        -->
        <one-to-one name="card" constrained="true"></one-to-one> </class>
        </hibernate-mapping>
    1. Card映射文件
      1. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        <class name="com.bjpowernode.hibernate.Card" table="t_card">
        <id name="id">
        <generator class="native"></generator>
        </id>
        <property name="cardNo"></property>
        </class>
        </hibernate-mapping>
    1. 上面是从人到身份证的单向对应关系,如果想实现双向只需在Card类中加入对Person类的引用。另外每个代码中用到的重要属性都做了详细注释,可以参考注释看代码。
  1. 唯一外键约束
    1. 单向关联(从Person到Card)
      1. 还拿上面两个实体类举例代码基本同上面相同,上面已经写的很详细,不同的地方只是Person的映射文件有所区别,在里面加入了几个属性。
      2. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        <class name="com.bjpowernode.hibernate.Person" table="t_person">
        <id name="id">
        <generator class="native">
        </generator>
        </id>
        <property name="name"></property>
        <!--
        这里面代码同上一篇博客,多对一映射代码相同,所不同的是加入了unique属性来限制只能是
        一对一。
        -->
        <many-to-one name="card" column="cardId" unique="true"></many-to-one>
        </class>
        </hibernate-mapping>
      3. 当你看到后是不是觉得和多对一映射关系很像呢,其实,它就是多对一的一种特殊情况也是就是多对一包括了一对一这种情况,我们通过加入了unique属性限制只能为一对一,多对一就成了一对一了。
    1. 双向关联
      1. 在Card实体以及映射文件中做了一些改动,如下:
      1. Card实体中加入了对Person的引用
      2. package com.bjpowernode.hibernate;
        
        public class Card {
        private int id;
        private String cardNo;
        //加入了对person对象的引用
        private Person person; //…………………………同上
        //…………………………同上
        }
      3. Card映射文件
      4. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        <class name="com.bjpowernode.hibernate.Card" table="t_card">
        <id name="id">
        <generator class="native"></generator>
        </id>
        <property name="cardNo"></property>
        <!-- PS -->
        <!-- property-ref指定对应哪个表的列,如果不设置该属性则默认参照表的主键
        在person表中的cardId列是参照Card表生成的,反过来,Card表必须也对应cardId列,
        才能确保一对一关系,但是呢,默认情况会选择参照person表主键,所以,这里加入了property-ref
        属性来限制一下,参照person表的哪个属性。
        -->
        <one-to-one name="person" property-ref="card"></one-to-one>
        </class>
        </hibernate-mapping>
  1. 一对一关联是一种重要的对应关系,尤其是唯一外键约束必须理解和学会运用,在实际开发中这种对应关系可能会更复杂需要根据业务去分析,但原理都是一样的理解了这个对于别的也会轻松上手。

ORM框架Hibernate (四) 一对一单向、双向关联映射的更多相关文章

  1. java之hibernate之多对多双向关联映射

    1.比如在权限管理中,角色和权限之间的关系就是多对多的关系,表结构为: 2.类结构 Role.java public class Role implements Serializable{ priva ...

  2. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  3. Hibernate一对一双向关联映射

    关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...

  4. 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

    上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...

  5. hibernate之关于一对一单向,双向关联映射

    [hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...

  6. Hibernate从入门到精通(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...

  7. Hibernate(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...

  8. 【SSH系列】hibernate映射 -- 一对一双向关联映射

    开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...

  9. Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...

随机推荐

  1. Noip2011提高组总结

    这套题思考的难度比较大,应该说是有四题基础题,一题比较复杂的搜索加模拟,还有一题需要深度思考一下.自己的代码漏洞还是很大,而且思考的时候会遗漏一些情况,这些错误都是致命的,去年Noip的惨败也证实了这 ...

  2. javascript 定义类(转载)

    Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...

  3. CSS3阴影 box-shadow的使用和技巧总结[转]

    text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...

  4. Sicily-1134

    一.      题意 按照孩子们需要的积木块数排序(从小到大),先处理需要积木块数少的孩子. 二.      代码 // // main.cpp // sicily-1134 // // Create ...

  5. 汇编语言学习——第二章 寄存器(CPU工作原理)

    1.一个典型的CPU由运算器.控制器.寄存器等器件组成,这些器件靠内部总线相连. 区别: 内部总线实现CPU内部各个器件之间的联系. 外部总线实现CPU和主板上其它器件的联系. 8086CPU有14个 ...

  6. javaweb学习路之四--cxf发布Webservice

    背景:maven构建的springMvc+mybatis框架 源码--->https://github.com/Zering/MyWeb 步骤:(本步骤是自己在实际探索过程中的步骤,我的思路是先 ...

  7. Jquery构建Form表单Post提交数据的简单方法

    $.extend({ PostSubmitForm: function (url, args) { var body = $(document.body), form = $("<fo ...

  8. 解决 win10 预览版开始菜单打不开的问题

    除了该文章[http://jingyan.baidu.com/article/64d05a025d2668de55f73b9e.html]里面说的解决方法之外,我只加上一点 . 打开本机防火墙,或者调 ...

  9. mfc主窗口添加背景图片后,如何实现在背景图片上输出文字

    1.若是文档视图程序的话,在视图类的OnDraw(CDC* pDC)函数中调用pDC->TextOut()函数,就像平常输出文字一样.若是嫌文字的背景颜色破坏了图像,可以在输出文字之前调用pDC ...

  10. [C#参考]事件和委托的关系

    前面说了委托,接下来就要说一说事件了,同时最后再说一下委托和事件的区别. 事件和委托很相似,事件就好像是被简化的针对特殊用途的委托.看下面的图: 从这张图中能看到,事件是发布者的一个成员,它不是类型. ...