`
cfeers
  • 浏览: 140295 次
  • 性别: 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方法,会发现出现空指针异常。其实在前面的关联关系中,最终都是实现了双向关联,而这里如果注释掉此句,正好成了单向关联的一个例证。

分享到:
评论

相关推荐

    hibernate入门一:单表操作(单对象操作)

    标题"hibernate入门一:单表操作(单对象操作)"表明这篇文章主要介绍的是Hibernate框架的基础使用,特别是针对数据库单表的简单操作,如增删改查,以及如何处理单个数据库对象。描述部分为空,但通常这样的教程会...

    Hibernate入门案例源码

    【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...

    初学hibernate,hibernate入门

    **初学Hibernate,Hibernate入门** ...随着对Hibernate的深入学习,你会发现它还支持更高级的功能,如级联操作、多对一、一对多等复杂关系映射、缓存机制、延迟加载等,这些都将极大地提升你的开发效率。

    hibernate入门--第一个实例

    【hibernate入门--第一个实例】 Hibernate 是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务。通过使用Hibernate,我们可以将数据库操作转换为对Java对象的操作,从而简化了数据库...

    hibernate入门

    Hibernate 支持多种对象关系映射,如一对一、一对多、多对一、多对多。例如,一个User可以有多个Order: ```xml &lt;!-- User.hbm.xml --&gt; &lt;!-- Order.hbm.xml --&gt; ``` 以上就是Hibernate入门的基础内容。...

    Hibernate基础和入门:新建表和插入表

    13. **一对多、多对一、一对一关系映射**:理解如何在实体类间建立这些关联关系,并在映射文件或注解中进行配置。 14. **集合映射**:例如List、Set、Map等集合类型的字段与数据库表的关联映射。 15. **懒加载和...

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

    本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...

    Hibernate入门到精通.pdf

    最后,书中可能会涵盖一些高级主题,如多对一、一对多、多对多的关系映射,以及继承映射、复合组件、查询优化等。这些内容都是Hibernate深入学习的重点,对于理解和掌握复杂的数据模型以及高效的数据操作至关重要。 ...

    hibernate系列(一)hibernate入门

    Hibernate支持一对一、一对多、多对一、多对多等各种关系映射,通过注解或XML配置文件定义。例如,一个用户可以有多个订单,订单也可以属于一个用户: ```java @Entity @Table(name = "Order") public class Order ...

    Hibernate3.1_学习源码

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

    hibernate入门源代码

    **Hibernate入门源代码详解** Hibernate 是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。这个资源包包含了“chapter07”目录下的源代码,是学习Hibernate基础知识的理想起点。让...

    hibernate入门简单实例

    15. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等,理解这些关系并正确配置是使用Hibernate的关键。 通过这个"hibernate_first"实例,你可以...

    Hibernate入门到精通

    - 双向一对一:双向关联意味着两个实体都能直接访问对方,除了`Person`表的外键,`IDCard`表也需要有一个字段指向`Person`,同样使用`&lt;one-to-one&gt;`标签。 3. 一对多(One-to-Many)关联映射: - 单向一对多:一...

    webwork+spring+hibernate入门实例

    《webwork+spring+hibernate入门实例》 在当今的Web开发领域,Spring、Hibernate和WebWork(现称为Struts 2)是三个极为重要的框架。本实例将引导初学者深入理解这三大框架的集成与应用,以及如何与MySQL数据库进行...

    hibernate快速入门

    1. **一对一(OneToOne)**:一个实体对应另一个实体的唯一实例。 2. **一对多(OneToMany)**:一个实体可以有多个相关联的实体实例。 3. **多对一(ManyToOne)**:多个实体对应一个实体实例。 4. **多对多...

    MyEclipse+Hibernate快速入门中文版

    - 多种映射策略:支持一对一、一对多、多对多等多种关联关系。 - 对象的持久化管理:可以实现单个对象映射到多个表。 - 支持集合类型的映射。 - 多态关联:能够处理继承关系中的关联问题。 - SQL查询的自定义:允许...

    MyEclipse Hibernate 快速入门中文版

    MyEclipse作为一款强大的Java EE集成开发环境,内置了对Hibernate的支持,使得在项目中集成和使用Hibernate变得更加便捷。 本快速入门教程首先会介绍Hibernate的核心概念,如实体类(Entity)、持久化(Persistence...

    struts+hibernate入门实例(eclipse版)

    ### Struts + Hibernate 入门实例(Eclipse 版) #### 一、开发环境搭建 在本章节中,作者朱千平将引导我们完成开发环境的搭建,包括以下几个步骤: 1. **下载安装Eclipse**: Eclipse 是一个开源的集成开发环境...

Global site tag (gtag.js) - Google Analytics