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. JAVA GUI学习 - JMenuBar菜单条、JMenu菜单、JMenuItem菜单项组件学习

    public class MenuBarKnow extends JFrame { JMenuBar jMenuBar; JMenu jMenuFile,jMenuEditor,jMenuAbout; ...

  2. HDOJ 1427(dfs) 速算24点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1427 思路分析: 题目要求判断是否存在一种运算组合使得4个数的计算结果为24,因为搜索的层次为3层,不 ...

  3. Matlab pivotgolf

    function scoreout = pivotgolf(course,pivotstrat) % PIVOTGOLF Pivot Pickin' Golf. % Your goal is to u ...

  4. BZOJ3231(矩阵连乘,稍有点复杂)

    题目:3231: [Sdoi2008]递归数列 题意: 一个由自然数组成的数列按下式定义:   对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 ...

  5. 理解SQL SERVER中的分区表

    转自:http://www.cnblogs.com/sienpower/archive/2011/12/31/2308741.html 简介 分区表是在SQL SERVER2005之后的版本引入的特性 ...

  6. sql 时间和字符串 取到毫秒级

    (select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')+(Select ri ...

  7. (转)WINDOWS内核对象

    WINDOWS内核对象 原文地址:http://blog.csdn.net/misterliwei/article/details/976988  支持原创 一.前言 Windows中有很多像进程对象 ...

  8. QT 程序自定义插件

    1,定义接口文件 /****************************************************************************************** ...

  9. Django forms 关于select和checkbox设置初始选中值及让前端选中指定值

    Django的forms和models一样很牛逼.他有两种功能,一是生成form表单,还有就是form表单的验证. 这里主要说一下生成form表单时经常用到的需要设置 初始值 / 默认值 的情况. 1 ...

  10. 运用Python语言编写获取Linux基本系统信息(二):文件系统使用情况获取

    本文跟着上一篇文章继续写,上一篇文章的链接 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 一.随便说说 获取文件系统使用情况的思路和上一篇获取主要系统是 ...