`
neeleon
  • 浏览: 183460 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate入门(七)关联关系讨论_一对一关系映射

阅读更多

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

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

>> 步骤一,建立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 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    hibernate_one_to_one映射简单入门例子

    **一、Hibernate一对一映射简介** 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者将数据库操作转化为面向对象的方式。在数据表之间,有一种常见的关联关系是一对一(One-to-One),即...

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

    在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...

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

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

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

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

    hibernate-tutorials_java_hibernate_Eclipse_fallenweg_

    本教程将详细介绍如何使用`@Entity`、`@Table`、`@Id`等注解,以及如何进行一对一、一对多、多对多等关联映射。 9. **查询语言(HQL)与 Criteria API** Hibernate提供了自己的查询语言HQL(Hibernate Query ...

    Hibernate入门案例源码

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

    hibernate入门--第一个实例

    在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...

    Hibernate 对象关系映射

    本人在厦门邦初培训时候用的ppt 快速入门文档 内容: 建立一对多的关联关系域模型 建立一对多的参照关系的模型 映射一对多关联关系 通过hibernateAPI级联操作关联对象 其它关系的映射:一对一,多对多

    Hibernate入门到精通

    2. 一对一(One-to-One)关联映射: - 单向一对一:在单向一对一关联中,一个实体(如`Person`)拥有一个唯一关联的实体(如`IDCard`),`Person`表中包含`IDCard`的外键。在Hibernate中,通过`&lt;one-to-one&gt;`标签并...

    02_传智播客hibernate教程_hibernate入门案例的细节分析

    10. **关联映射**:一對一、一对多、多对一、多对多的关系映射实现,包括@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等。 11. **缓存机制**:理解Hibernate的第一级缓存(Session级别)和第二级缓存...

    hibernate系列(一)hibernate入门

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

    hibernate入门简单实例

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

    Hibernate开发指南___夏昕

    “Hibernate高级特性”章节则进一步探讨了XDoclet与Hibernate映射、数据检索(包括CriteriaQuery和HQL)、数据关联(如一对一、一对多、多对多关系处理)、数据访问(PO和VO的使用)、事务管理、锁机制、分页、缓存...

    Hibernate_3.2.0_Reference_zh_CN

    1. 一对一(OneToOne):一个实体对象对应数据库中的一个记录。 2. 一对多(OneToMany):一个实体对象可以对应多个子对象,如学生与课程的关系。 3. 多对一(ManyToOne):多个实体对象对应一个父对象,如课程与...

    hibernate入门与概述

    - **关联关系**:关联关系是对象之间的一种联系,比如一个班级可以有多个学生,这种关系在ORM中可以通过一对一、一对多、多对一、多对多等方式实现。 - **依赖关系**:对象之间的短暂交互,如函数调用,不涉及长期...

    hibernate入门

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中操作数据库,而无需直接编写SQL语句。ORM框架如Hibernate简化了数据持久化的过程,通过将对象模型与数据库模型进行映射,实现了...

    最经典的hibernate教程_从入门到精通_第二篇

    11. 高级主题:包括关联映射(一对一,一对多,多对一,多对多),懒加载,集合映射,以及时间戳和版本字段等。 12. Hibernate与Spring的整合:如果教程深入,可能会涉及如何在Spring框架中集成Hibernate,使用...

Global site tag (gtag.js) - Google Analytics