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. Android 4.4及以上系统下应用的状态栏颜色渐变效果的实现

    上一篇转载的博文里讲到了怎么开启状态栏透明的效果,不过如果在有ActionBar的情况下,会出现状态栏透明而ActionBar横亘在状态栏和内容之间的丑陋情况,如下图: 通过百度之后,发现了GitHu ...

  2. 自制的七个C,总结的太好了

    拿破仑·希尔把它叫做:“自制的七个C”: 1.控制自己的时间(Clock). 时间虽不断流逝,但也可以任人支配.你可以选择时间来工作.游戏.休息.烦恼..虽然客观的环境不一定能任人掌握,但人却可以自己 ...

  3. CDLinux环境下WiFi密码破解

    > 准备好所需软件以及上篇教程中使用Fbinstool制作的可启动U盘 2 > 解压CDLinux-0.9-spring-0412.iso到U盘的根目录  如图 3 > 打开fbin ...

  4. ie调试控制台

    function initConsole() { var console = document.createElement('div'); console.id = 'errorConsole'; d ...

  5. 简单JSONP跨域请求

    JSONP原理:利用<script>标签的src属性实现跨域的请求.可在URL中提供回调函数的名字.后台进过处理后将数据以回调函数参数的形式返回. demo:JSONP请求不同端口的数据 ...

  6. mysql 表及其列字符集设置

    --修改表的字符集 alter table rtb_media_daily_report character set gbk; --查询表列字符集 show full columns from rtb ...

  7. Python学习之collections module-defaultdict()

    defaultdict()继承自dict系统内置类型defaultdict()定义以及作用:    返回一个和dictionay类似对象,和dict不同:      1. 可以制定key对应value ...

  8. 深入浅出—JAVA(4)

    4.方法操作实例变量

  9. CSS实现背景图尺寸不随浏览器大小而变化的两种方法

    一些网站的首页背景图尺寸不随浏览器缩放而变化,本例使用CSS 实现背景图尺寸不随浏览器缩放而变化,方法一. 把图片作为background,方法二使用img标签.喜欢的朋友可以看看   一些网站的首页 ...

  10. Objective-C中的类目(Category),延展(Extension)

    类目和延展的作用都是为了扩展一个类. Objective-C中的类目(Category) 一.类目的定义和作用 类目也叫分类,英文Category,在没有原类.m文件的基础上,给该类添加方法. 比如, ...