`
cfeers
  • 浏览: 135447 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hibernate入门(七):一对一

阅读更多
3.一对一关系映射:

典型的实例:一个人有一个身份证,而一个身份证只属于某一个人。以此为模型实现一对一关系的映射。下面的实例先以主键进行关联:

主键关联:从表的主键同时又作为外键参考主表的主键。比如在下面的实例中,人作为主表,身份证作为从表。

>>步骤一,建立Person类及相关的实体配置文件。
package com.asm.hibernate.domain;   
public class Person {   
    private int id;   
    private String name;   
    private IdCard idCard;   
...省略相应的get/set方法。   
}     
配置文件:person.hbm.xml 和前面的配置一样,只需要留意下</one-to-one>元素,内容如下:
<hibernate-mapping package="com.asm.hibernate.domain">   
    <class name="Person">   
        <id name="id">   
            <generator class="native" />   
        </id>   
        <property name="name"></property>   
        <one-to-one name="idCard"></one-to-one>   
    </class>   
</hibernate-mapping>  
>>步骤二,建立IdCard类及相关的实体配置文件。
package com.asm.hibernate.domain;   
import java.util.Date;   
public class IdCard {   
    private int id;   
    private Date validity;   
    private Person person;     
    ...省略相应的get/set方法。   
}  
从表配置文件:IdCard.hbm.xml ,内容如下:
<hibernate-mapping package="com.asm.hibernate.domain">   
    <class name="IdCard">   
        <id name="id">   
            <generator class="foreign">   
                <param name="property">person</param>   
            </generator>   
        </id>   
        <property name="validity"></property>   
        <one-to-one name="person" constrained="true"></one-to-one>   
    </class>   
</hibernate-mapping>  
配置文件说明:由于上面提到的是采取主键关联,即是说这里的id即是主键,同时也是(关联相关表的)外键,因此,以下对id的生成采取了”foreign”方式,其实这种方式也就指明了主键同时为外键。下面的<param>指定了外键的参考信息,此元素中的内容指明了它参考<one-to-one>的person。 注意在<one-to-one name="person" constrained="true">中设定了constrained属性,其作用是说明该配置文件所映射表的主键同时作为外键,参照关联类对应表的主键。设定了此属性可用“show create table idcard”查看表idcard的定义发生了变化。

>>步骤三,修改主配置文件,关联上面的实体配置文件。

>>步骤四,编写测试类,OneToOneTest.java 内容如下:省略导入的包。

package com.asm.hibernate.test;   
public class OneToOneTest {   
    public static void main(String[] args) {   
        add();   
    }   
    static void add() {   
        Session s = null;   
        Transaction tr = null;   
        try {   
            s = HibernateUtil.getSession();   
            tr = s.beginTransaction();   
  
            Person person = new Person();   
            person.setName("pName");   
            IdCard idCard = new IdCard();   
            idCard.setValidity(new Date());   
               
            //分别注释掉以下两句,看程序执行情况   
            person.setIdCard(idCard);   
            idCard.setPerson(person);   
  
            s.save(person);   
            s.save(idCard);   
            tr.commit();   
        } finally {   
            if (s != null)   
                s.close();   
        }   
    }   
}  
说明:留意上面的注释,如果注释掉第一句,发现一切正常,因为主对象是可以没有此属性,它的实体配置文件也基本与前面一样。而如果注释掉下面一句,将会报错,原因是“attempted to assign id from null one-to-one property: person”,IdCard的实体配置文件关联了一个表,而它采取主键关联,而主键关联要依赖于person属性的id,如果这里注释掉,即没有了此属性,它也关联不了相应的id。简单的说,IdCard来要关联Person,我们称它为从对象,而person并不关联谁,我们称为主对象。现在只要记住,从对象关联了表(关联了主对象),必须设定它所关联的主对象属性。

>>步骤五,编写两个查询方法,一个查询主对象,主要代码:

static Person query(int id) {   
        Session s = null;   
        Transaction tr = null;   
        try {   
            s = HibernateUtil.getSession();   
            tr = s.beginTransaction();   
            Person p = (Person) s.get(Person.class, id);   
            System.out.println("身份证有效期:" + p.getIdCard().getValidity());   
            tr.commit();   
            return p;   
        } finally {   
            if (s != null)   
                s.close();   
        }   
    }    
然后再在main方法中调用此方法,并开启控制台数据库库语言显示后,可以从控制台看出查询主对象只select一次;再增加一个查询从对象的方法,主要代码:
static IdCard query2(int id) {   
        Session s = null;   
        Transaction tr = null;   
        try {   
            s = HibernateUtil.getSession();   
            tr = s.beginTransaction();   
            IdCard idCard = (IdCard) s.get(IdCard.class, id);   
            //System.out.println("人的名字:" + idCard.getPerson().getName());   
            //去掉上一句注释后,发现会查询两次。   
            tr.commit();   
            return idCard;   
        } finally {   
            if (s != null)   
                s.close();   
        }   
    }  
同样在main方法中调用此方法,并开启控制台数据库库语言显示后。从控制台看出也只会查询一次,但是如果去掉注释后发现会查询两次。  接着,在此例的基础上修改成外键关联。

外键关联:从表的主键并不作为外键参考主表的主键,而是将其它字段作为外键参的主键。

其实在上例的基础上,我们只需要修改IdCard.hbm.xml配置文件即可,修改后的内容如下:

<hibernate-mapping package="com.asm.hibernate.domain">  
    <class name="IdCard">  
        <id name="id">  
            <generator class="native" />  
        </id>  
        <property name="validity"></property>  
        <many-to-one name="person" column="person_id" unique="true" />  
    </class>  
</hibernate-mapping>   
说明:由于采取了外键关联,所以这里的从表的主键将不再作为外键参考主表的主键,所以它会采取一般的方式生成主键,即<id>生成和以前的那此相同采取“native”方式。 另注意到< many-to-one >,发现增加了unique有属性,这样尽管是多对一,但能有效保证实质是一对一。  这时运行原OneToOneTest,发现仍是和以前一样。 如果我们再修改Person的实体配置文件<one-to-one>如下:

<one-to-one name="idCard" property-ref="person"/> 特别要注意到property-ref 属性。可以结合执行后表的结构来看。其实如果注释掉此句,其结果就是通过身份证可以查看到Person的相关信息,但是通过Person却不能找到身份证信息,因为Hibernate完全依赖实体配置文件(映射文件)。注释掉当然就不能找到。而事实上这时在OneToOne中调用query方法,会发现出现空指针异常。其实在前面的关联关系中,最终都是实现了双向关联,而这里如果注释掉此句,正好成了单向关联的一个例证。

分享到:
评论

相关推荐

    Hibernate3开发.pdf

    包括:集合映射、一对一、一对多、多对多 第六章:性能提升和二级缓存 包括:抓取策略、集合的性能、二级缓存、查询缓存、管理缓存 第七章:基本实现原理 包括:分增删改查的操作说明Hibernate基本的实现原理 第...

    Hibernate3.1_学习源码

    案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。

    hibernate 映射关系学习入门 一对一映射

    hibernate 映射关系学习入门 一对一映射Eclipse源码

    hibernate一对一外键关系

    hibernate一对一外键关系,很适合入门者学习.

    Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班

    Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班

    hibernate学习入门一对多实体映射源码

    hibernate初学者学习入门之一对多实体映射关系源码

    hibernate入门与概述

    hibernate入门与概述。介绍对象-关系 映射基础,映射对象标识符,映射一对多关联关系,操纵持久化对象,hibernate的检索策略。

    Hibernate入门教程学习笔记

    这是一个Hibernate入门学习的不错资源,主要内容包括Hibernate主配置文件的讲解、映射普通属性、映射主键、映射集合、映射关联关系(一对多多对一、多对多、一对一)、HQL查询等内容,最后给出一个综合练习案例

    Hibernate入门到精通

    对Hibernate从入门到精通 一步步讲解,里面带有截图还有操作代码,还带有自己的分析

    Hibernate入门经典(Beginning Hibernate-For Hibernate 5, 4th Edition)-2016年英文原版,0积分

    Hibernate入门经典(Beginning Hibernate-For Hibernate 5, 4th Edition)-2016年英文原版,0积分——Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立...

    Hibernate学习笔记和资料

    hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式

    Hibernate入门.docx

    Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping ,在Java对象与关系数据库之间 建立某种映射,以实现直接存取Java对象 ! 为什么要使用Hibernate? 既然Hibernate是关于Java对象和关系数据库...

    struts2+spring+hibernate 入门实例

    struts2+hibernate 入门 学习 包含对学生信息的增删查改,包含数据库test.sql,放到项目下能够 运行的实例 基础学习 ,一看就懂

    传智播客李勇hibernate源码1-20课

    传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|... 20_一对一外键关联关系的映射与原理分析

    Hibernate 课件_基础入门

    希望能对大家学习 Hibernate 提供帮助. 这是第一篇, 内容如下: 了解基于B/S的三层架构; 了解持久化层-O/R Mapping ;理解Java持久化层技术Hibernate; 学习Hibernate的开发步骤;学习Hibernate的重要接口

    dwr + hibernate 入门示例代码

    dwr + hibernate写的一个检测用户名是否可用的简单代码,非常适合初学者.附件中包含dwr和hibernate等第三方lib,以及数据库建表语句,对本示例作了简要说明

    MyEclipse开发Struts+Spring+Hibernate入门(手把手教你)

    MyEclipse开发Struts+Spring+Hibernate入门(手把手教你),相信你通过本实例, 你会对SSH开发有一个很深刻的认识。

    Hibernate入门例

    Hibernate是一个比较流行的持久层框架,它对JDBC进行轻量级的封装,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。本例子为hibernate入门例子,操作access数据库。

    Hibernate入门例子

    Hibernate一个精炼的入门例子。 希望对你有帮助。

    struts+hibernate一对多的管理系统

    学习struts hibernate 的入门系统,你会收获不少!

Global site tag (gtag.js) - Google Analytics