- 浏览: 135447 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1536一、 环境搭建和基本映 ... -
hibernate.cfg.xml文件详解
2010-08-26 15:56 709<?xml version='1.0' encoding ... -
hiberante入门(十七):简要总结及源码文档
2010-08-26 11:28 664十三、总结: 1.主配置与实体(映射)配置: 关于这些配置 ... -
hiberante入门(十六):一些细节理论
2010-08-26 11:26 686十二、一些细节问题分 ... -
hiberante入门(十五):事务相关-悲观乐观锁
2010-08-26 11:25 10951.事务引发的三层架构MV ... -
hiberante入门(十四):缓存2
2010-08-26 11:24 404>>步骤四、测试二 ... -
hiberante入门(十四):缓存1
2010-08-26 11:10 7301.模拟缓存并简要说明缓存实现原理 在myhibernate ... -
hiberante入门(十三):懒加载
2010-08-26 11:07 9034.懒加载: 在前面我们已经对懒加载有所提及,现在再借助一个 ... -
hiberante入门(十二):继承关系2
2010-08-26 11:03 910上接hiberante入门(十二 ... -
hiberante入门(十二):继承关系1
2010-08-26 11:01 7573.继承关系: 在前面的部门员工实例中,我们设定的员工只是普 ... -
hibernate入门(十一):级联操作inversin属性
2010-08-26 10:56 1461九、关联关系中的高级应用 1.级联操作: 在前面的一对多 ... -
hiberante入门(十):其它集合类型
2010-08-26 10:53 740八、其它集合类型 说明:在前面我们已经使用过set集合类型, ... -
hibernate入门(九):组件关系映射
2010-08-26 10:51 7475.组件关系映射: 典型实例:每个人有不同的名字,或者多个人 ... -
hibernate入门(八):多对多
2010-08-26 10:48 6224.多对多关系映射: 典型实例:一个学生可以有多个老师 ... -
hibernate入门(六):一对多
2010-08-26 10:36 6642.一对多关系映射: 上面提到的多个员工对应于一个部门,是多 ... -
hibernate入门(五):多对一
2010-08-26 10:32 6171.多对一关系映射: 一个部门有可以有多个员工,而一个员工只 ... -
hibernate入门(四):HQL QBC初步
2010-08-26 10:22 876四 完善工具类及HQL QBC ... -
hibernate入门(三):对象的三种状态
2010-08-26 10:20 653三 Session中的主要方法 ... -
hibernate入门(二):优化代码
2010-08-26 10:17 735二 优化代码 1.为会么要优化 在前面我们已经知道,获取S ... -
hibernate入门(一):第一个应用实例
2010-08-26 10:15 852一 第一个应用实例 1.搭建环境:新建一个名为Hiberna ...
相关推荐
包括:集合映射、一对一、一对多、多对多 第六章:性能提升和二级缓存 包括:抓取策略、集合的性能、二级缓存、查询缓存、管理缓存 第七章:基本实现原理 包括:分增删改查的操作说明Hibernate基本的实现原理 第...
案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。
hibernate 映射关系学习入门 一对一映射Eclipse源码
hibernate一对一外键关系,很适合入门者学习.
Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班
hibernate初学者学习入门之一对多实体映射关系源码
hibernate入门与概述。介绍对象-关系 映射基础,映射对象标识符,映射一对多关联关系,操纵持久化对象,hibernate的检索策略。
这是一个Hibernate入门学习的不错资源,主要内容包括Hibernate主配置文件的讲解、映射普通属性、映射主键、映射集合、映射关联关系(一对多多对一、多对多、一对一)、HQL查询等内容,最后给出一个综合练习案例
对Hibernate从入门到精通 一步步讲解,里面带有截图还有操作代码,还带有自己的分析
Hibernate入门经典(Beginning Hibernate-For Hibernate 5, 4th Edition)-2016年英文原版,0积分——Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立...
hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping ,在Java对象与关系数据库之间 建立某种映射,以实现直接存取Java对象 ! 为什么要使用Hibernate? 既然Hibernate是关于Java对象和关系数据库...
struts2+hibernate 入门 学习 包含对学生信息的增删查改,包含数据库test.sql,放到项目下能够 运行的实例 基础学习 ,一看就懂
传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|... 20_一对一外键关联关系的映射与原理分析
希望能对大家学习 Hibernate 提供帮助. 这是第一篇, 内容如下: 了解基于B/S的三层架构; 了解持久化层-O/R Mapping ;理解Java持久化层技术Hibernate; 学习Hibernate的开发步骤;学习Hibernate的重要接口
dwr + hibernate写的一个检测用户名是否可用的简单代码,非常适合初学者.附件中包含dwr和hibernate等第三方lib,以及数据库建表语句,对本示例作了简要说明
MyEclipse开发Struts+Spring+Hibernate入门(手把手教你),相信你通过本实例, 你会对SSH开发有一个很深刻的认识。
Hibernate是一个比较流行的持久层框架,它对JDBC进行轻量级的封装,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。本例子为hibernate入门例子,操作access数据库。
Hibernate一个精炼的入门例子。 希望对你有帮助。
学习struts hibernate 的入门系统,你会收获不少!