- 浏览: 140295 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
aa87963014:
很好,但是update/insert 是否加锁 。加锁对sel ...
数据库锁 -
RobustTm:
我的这种做法也可以添加A和B
但是换成更新就有问题
hibernate入门(十一):级联操作inversin属性 -
RobustTm:
这位仁兄可以提供一对多双向关联完整的代码不?
我碰到了问题,采 ...
hibernate入门(十一):级联操作inversin属性 -
cfeers:
markxing 写道谢谢分享。。。
不客气,呵呵。
struts2.0 struts.xml配置文件详解 -
markxing:
谢谢分享。。。
struts2.0 struts.xml配置文件详解
3.一对一关系映射:
典型的实例:一个人有一个身份证,而一个身份证只属于某一个人。以此为模型实现一对一关系的映射。下面的实例先以主键进行关联:
主键关联:从表的主键同时又作为外键参考主表的主键。比如在下面的实例中,人作为主表,身份证作为从表。
>>步骤一,建立Person类及相关的实体配置文件。
>>步骤三,修改主配置文件,关联上面的实体配置文件。
>>步骤四,编写测试类,OneToOneTest.java 内容如下:省略导入的包。
>>步骤五,编写两个查询方法,一个查询主对象,主要代码:
外键关联:从表的主键并不作为外键参考主表的主键,而是将其它字段作为外键参的主键。
其实在上例的基础上,我们只需要修改IdCard.hbm.xml配置文件即可,修改后的内容如下:
<one-to-one name="idCard" property-ref="person"/> 特别要注意到property-ref 属性。可以结合执行后表的结构来看。其实如果注释掉此句,其结果就是通过身份证可以查看到Person的相关信息,但是通过Person却不能找到身份证信息,因为Hibernate完全依赖实体配置文件(映射文件)。注释掉当然就不能找到。而事实上这时在OneToOne中调用query方法,会发现出现空指针异常。其实在前面的关联关系中,最终都是实现了双向关联,而这里如果注释掉此句,正好成了单向关联的一个例证。
典型的实例:一个人有一个身份证,而一个身份证只属于某一个人。以此为模型实现一对一关系的映射。下面的实例先以主键进行关联:
主键关联:从表的主键同时又作为外键参考主表的主键。比如在下面的实例中,人作为主表,身份证作为从表。
>>步骤一,建立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.cfg.xml文件详解(annotation 配置)
2010-08-26 15:57 1561一、 环境搭建和基本映 ... -
hibernate.cfg.xml文件详解
2010-08-26 15:56 742<?xml version='1.0' encoding ... -
hiberante入门(十七):简要总结及源码文档
2010-08-26 11:28 693十三、总结: 1.主配置与实体(映射)配置: 关于这些配置 ... -
hiberante入门(十六):一些细节理论
2010-08-26 11:26 746十二、一些细节问题分 ... -
hiberante入门(十五):事务相关-悲观乐观锁
2010-08-26 11:25 11641.事务引发的三层架构MV ... -
hiberante入门(十四):缓存2
2010-08-26 11:24 426>>步骤四、测试二 ... -
hiberante入门(十四):缓存1
2010-08-26 11:10 7601.模拟缓存并简要说明缓存实现原理 在myhibernate ... -
hiberante入门(十三):懒加载
2010-08-26 11:07 9274.懒加载: 在前面我们已经对懒加载有所提及,现在再借助一个 ... -
hiberante入门(十二):继承关系2
2010-08-26 11:03 963上接hiberante入门(十二 ... -
hiberante入门(十二):继承关系1
2010-08-26 11:01 8253.继承关系: 在前面的部门员工实例中,我们设定的员工只是普 ... -
hibernate入门(十一):级联操作inversin属性
2010-08-26 10:56 1501九、关联关系中的高级应用 1.级联操作: 在前面的一对多 ... -
hiberante入门(十):其它集合类型
2010-08-26 10:53 762八、其它集合类型 说明:在前面我们已经使用过set集合类型, ... -
hibernate入门(九):组件关系映射
2010-08-26 10:51 7735.组件关系映射: 典型实例:每个人有不同的名字,或者多个人 ... -
hibernate入门(八):多对多
2010-08-26 10:48 6444.多对多关系映射: 典型实例:一个学生可以有多个老师 ... -
hibernate入门(六):一对多
2010-08-26 10:36 6882.一对多关系映射: 上面提到的多个员工对应于一个部门,是多 ... -
hibernate入门(五):多对一
2010-08-26 10:32 6421.多对一关系映射: 一个部门有可以有多个员工,而一个员工只 ... -
hibernate入门(四):HQL QBC初步
2010-08-26 10:22 909四 完善工具类及HQL QBC ... -
hibernate入门(三):对象的三种状态
2010-08-26 10:20 687三 Session中的主要方法 ... -
hibernate入门(二):优化代码
2010-08-26 10:17 764二 优化代码 1.为会么要优化 在前面我们已经知道,获取S ... -
hibernate入门(一):第一个应用实例
2010-08-26 10:15 876一 第一个应用实例 1.搭建环境:新建一个名为Hiberna ...
相关推荐
标题"hibernate入门一:单表操作(单对象操作)"表明这篇文章主要介绍的是Hibernate框架的基础使用,特别是针对数据库单表的简单操作,如增删改查,以及如何处理单个数据库对象。描述部分为空,但通常这样的教程会...
【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...
**初学Hibernate,Hibernate入门** ...随着对Hibernate的深入学习,你会发现它还支持更高级的功能,如级联操作、多对一、一对多等复杂关系映射、缓存机制、延迟加载等,这些都将极大地提升你的开发效率。
【hibernate入门--第一个实例】 Hibernate 是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务。通过使用Hibernate,我们可以将数据库操作转换为对Java对象的操作,从而简化了数据库...
Hibernate 支持多种对象关系映射,如一对一、一对多、多对一、多对多。例如,一个User可以有多个Order: ```xml <!-- User.hbm.xml --> <!-- Order.hbm.xml --> ``` 以上就是Hibernate入门的基础内容。...
13. **一对多、多对一、一对一关系映射**:理解如何在实体类间建立这些关联关系,并在映射文件或注解中进行配置。 14. **集合映射**:例如List、Set、Map等集合类型的字段与数据库表的关联映射。 15. **懒加载和...
本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...
最后,书中可能会涵盖一些高级主题,如多对一、一对多、多对多的关系映射,以及继承映射、复合组件、查询优化等。这些内容都是Hibernate深入学习的重点,对于理解和掌握复杂的数据模型以及高效的数据操作至关重要。 ...
Hibernate支持一对一、一对多、多对一、多对多等各种关系映射,通过注解或XML配置文件定义。例如,一个用户可以有多个订单,订单也可以属于一个用户: ```java @Entity @Table(name = "Order") public class Order ...
案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。
**Hibernate入门源代码详解** Hibernate 是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。这个资源包包含了“chapter07”目录下的源代码,是学习Hibernate基础知识的理想起点。让...
15. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等,理解这些关系并正确配置是使用Hibernate的关键。 通过这个"hibernate_first"实例,你可以...
- 双向一对一:双向关联意味着两个实体都能直接访问对方,除了`Person`表的外键,`IDCard`表也需要有一个字段指向`Person`,同样使用`<one-to-one>`标签。 3. 一对多(One-to-Many)关联映射: - 单向一对多:一...
《webwork+spring+hibernate入门实例》 在当今的Web开发领域,Spring、Hibernate和WebWork(现称为Struts 2)是三个极为重要的框架。本实例将引导初学者深入理解这三大框架的集成与应用,以及如何与MySQL数据库进行...
1. **一对一(OneToOne)**:一个实体对应另一个实体的唯一实例。 2. **一对多(OneToMany)**:一个实体可以有多个相关联的实体实例。 3. **多对一(ManyToOne)**:多个实体对应一个实体实例。 4. **多对多...
- 多种映射策略:支持一对一、一对多、多对多等多种关联关系。 - 对象的持久化管理:可以实现单个对象映射到多个表。 - 支持集合类型的映射。 - 多态关联:能够处理继承关系中的关联问题。 - SQL查询的自定义:允许...
MyEclipse作为一款强大的Java EE集成开发环境,内置了对Hibernate的支持,使得在项目中集成和使用Hibernate变得更加便捷。 本快速入门教程首先会介绍Hibernate的核心概念,如实体类(Entity)、持久化(Persistence...
### Struts + Hibernate 入门实例(Eclipse 版) #### 一、开发环境搭建 在本章节中,作者朱千平将引导我们完成开发环境的搭建,包括以下几个步骤: 1. **下载安装Eclipse**: Eclipse 是一个开源的集成开发环境...