- 浏览: 183460 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xoxoj:
如果发现input输入框里包含这些全角的内容,jquery应该 ...
全角正则 -
TJYCHYANGCHENHUI:
不对吧!你的第一句话说错了好吧,在没有开启事务的情况下,sa ...
hibernate入门(三)Session中的主要方法 -
leonardleonard:
好帖
js公共函数(utils.js) -
xyqqjy:
朋友你和我的现状很像啊!
我离职快一年了,一直没有再做开发这一 ...
浮躁,我 -
djy1135:
确实需要静一下心! 一样一样来吧。 东西学不半扔了,跟没学差 ...
浮躁,我
典型的实例:一个人有一个身份证,而一个身份证只属于某一个人。以此为模型实现一对一关系的映射。下面的实例先以主键进行关联:
主键关联 :从表的主键同时又作为外键参考主表的主键。比如在下面的实例中,人作为主表,身份证作为从表。
>> 步骤一,建立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入门(十二)一些细节问题分析
2010-07-29 11:17 7481. 实体配置文件中的类型问题 : 在前 ... -
hibernate入门(十一)事务
2010-07-29 11:16 9491.事务引发的三层架构MVC讨论: 在前面的程序代码中多次用 ... -
hibernate入门(十)缓存
2010-07-29 11:11 7101. 模拟缓存并简要说明缓存实现原理 在myhib ... -
hibernate入门(九)关联关系中的高级应用_概述关联关系中的懒加载
2010-07-29 11:09 8305. 概述关联关系中的懒加载: (1) 一对 ... -
hibernate入门(九)关联关系中的高级应用_懒加载
2010-07-29 11:07 7524. 懒加载: 在前面我们已经对懒加载有所提及,现 ... -
hibernate入门(九)关联关系中的高级应用_继承关系
2010-07-29 10:59 9573. 继承关系 : 在前面的部门员工实例 ... -
hibernate入门(九)关联关系中的高级应用_inverse属性
2010-07-29 10:43 849inverse 的作用:询问是否放弃维护关系,默认是fals ... -
hibernate入门(九)关联关系中的高级应用_级联操作
2010-07-29 10:40 8561. 级联操作 : ... -
hibernate入门(八)其它集合类型
2010-07-29 10:38 819说明:在前面我们已经使用过set 集合类型,其实除了set ... -
hibernate入门(七)关联关系讨论_组件关系映射
2010-07-29 10:36 774典型实例:每个人有不同的名字,或者多个人可以是同一个名字,对于 ... -
hibernate入门(七)关联关系讨论_多对多关系映射
2010-07-29 10:31 820典型实例:一个学生可以有多个老师,同样一个老师可以有多个学生, ... -
hibernate入门(七)关联关系讨论_一对多关系映射
2010-07-29 10:25 6932 .一对多关系映射: 上面提到的多个员工对应 ... -
hibernate入门(七)关联关系讨论_多对一关系映射
2010-07-29 10:22 8281 .多对一关系映射 : 一个部门有可以有多 ... -
hibernate入门(六)基本应用实例:Dao设计
2010-07-29 10:20 10001 .总体设计:设计User 对象及相关实体配置文件,工具 ... -
hibernate入门(五)完善工具类及HQL QBC初步相关
2010-07-29 10:17 10671 .无聊的讨论 : 在前面我们写了一个 ... -
hibernate入门(四)对象三种状态
2010-07-29 10:12 8551 .瞬时(transient ) ... -
hibernate入门(三)Session中的主要方法
2010-07-29 10:09 10821 .保存数据:save ,presist 说明 ... -
hibernate入门(二)优化代码
2010-07-29 10:07 7661 .为会么要优化 ... -
hibernate入门(一)第一个应用实例
2010-07-29 10:03 851一 、第一个应用实例 ...
相关推荐
本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
**一、Hibernate一对一映射简介** 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者将数据库操作转化为面向对象的方式。在数据表之间,有一种常见的关联关系是一对一(One-to-One),即...
在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...
传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|... 20_一对一外键关联关系的映射与原理分析
Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班
本教程将详细介绍如何使用`@Entity`、`@Table`、`@Id`等注解,以及如何进行一对一、一对多、多对多等关联映射。 9. **查询语言(HQL)与 Criteria API** Hibernate提供了自己的查询语言HQL(Hibernate Query ...
【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...
在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...
本人在厦门邦初培训时候用的ppt 快速入门文档 内容: 建立一对多的关联关系域模型 建立一对多的参照关系的模型 映射一对多关联关系 通过hibernateAPI级联操作关联对象 其它关系的映射:一对一,多对多
2. 一对一(One-to-One)关联映射: - 单向一对一:在单向一对一关联中,一个实体(如`Person`)拥有一个唯一关联的实体(如`IDCard`),`Person`表中包含`IDCard`的外键。在Hibernate中,通过`<one-to-one>`标签并...
10. **关联映射**:一對一、一对多、多对一、多对多的关系映射实现,包括@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等。 11. **缓存机制**:理解Hibernate的第一级缓存(Session级别)和第二级缓存...
Hibernate支持一对一、一对多、多对一、多对多等各种关系映射,通过注解或XML配置文件定义。例如,一个用户可以有多个订单,订单也可以属于一个用户: ```java @Entity @Table(name = "Order") public class Order ...
15. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等,理解这些关系并正确配置是使用Hibernate的关键。 通过这个"hibernate_first"实例,你可以...
“Hibernate高级特性”章节则进一步探讨了XDoclet与Hibernate映射、数据检索(包括CriteriaQuery和HQL)、数据关联(如一对一、一对多、多对多关系处理)、数据访问(PO和VO的使用)、事务管理、锁机制、分页、缓存...
1. 一对一(OneToOne):一个实体对象对应数据库中的一个记录。 2. 一对多(OneToMany):一个实体对象可以对应多个子对象,如学生与课程的关系。 3. 多对一(ManyToOne):多个实体对象对应一个父对象,如课程与...
- **关联关系**:关联关系是对象之间的一种联系,比如一个班级可以有多个学生,这种关系在ORM中可以通过一对一、一对多、多对一、多对多等方式实现。 - **依赖关系**:对象之间的短暂交互,如函数调用,不涉及长期...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中操作数据库,而无需直接编写SQL语句。ORM框架如Hibernate简化了数据持久化的过程,通过将对象模型与数据库模型进行映射,实现了...
11. 高级主题:包括关联映射(一对一,一对多,多对一,多对多),懒加载,集合映射,以及时间戳和版本字段等。 12. Hibernate与Spring的整合:如果教程深入,可能会涉及如何在Spring框架中集成Hibernate,使用...