一对一关联关系的使用-开心就好-iteye技术网站
2011年09月01日
一对一关系在实际生活中是比较常见的,例如学生与学生证的关系,通过学生证可以找到学生。一对一关系在Hibernate中的实现有两种方式,分别是主键关联和外键关联。
1.以主键关联
主键关联的重点是,关联的两个实体共享一个主键值。例如,Student与Card是一对一关系,它们在数据库中对应的表分别是t_student 和t_card。它们共用一个主键值id,这个主键可由t_student表或t_card表生成。问题是如何让另一张表引用已经生成的主键值呢?例如,t-student表填入了主键id的值,t_card表如何引用它?这需要在Hibernate的映射文件中使用主键的foreign生成机制。
为了表示Student与Card之间的一对一关联关系,在Student和Card的映射文件Student.hbm.xml和Card.hbm.xml中都要使用标记,如例程9-2所示。
例程9-2 Student.hbm.xml
-------------------------------------------------- ------------------
---------------------------
元素的lazy属性设定为true,表示延迟加载,如果lazy的值设置为false,则表示立即加载。下面对立即加载和延迟加载这两个概念进行说明。
立即加载:表示Hibernate在从数据库中取得数据,组装好一个对象(比如学生1)后,会立即再从数据库取得数据,组装此对象所关联的对象(例如学生证1)。
延迟加载:表示Hibernate在从数据库中取得数据,组装好一个对象(比如学生1)后,不会立即再从数据库取得数据,组装此对象所关联的对象(例如学生证1),而是等到需要时,才会从数据库取得数据,组装此关联对象。
元素的cascade属性表明操作是否从父对象级联到被关联的对象,它的取值如下。
none:在保存、删除或修改对象时,不对其附属对象(关联对象)进行级联操作。这是默认设置。
save-update:在保存、更新当前对象时,级联保存、更新附属对象(临时对象、游离对象)。
delete:在删除当前对象时,级联删除附属对象。
all:在所有情况下均进行级联操作,即包含save-update和delete操作。
delete-orphan:删除和当前对象解除关系的附属对象。
元素的fetch属性的可选值是join和select,默认值是select。当fetch属性设定为 join时,表示连接抓取(Join fetching): Hibernate通过 在SELECT语句使用OUTER JOIN(外连接)来获得对象的关联实例或者关联集合。 当fetch属性设定为select时,表示查询抓取(Select fetching):需要另外发送一条 SELECT 语句抓取当前对象的关联实体或集合。
例程9-3中元素的cascade属性设置为“all”,表示增加、删除及修改Student对象时,都会级联增加、删除和修改Card对象。
例程9-3 Card.hbm.xml
-------------------------------------------------- ---------------------------------------------
student
在例程9-3中,Card.hbm.xml的主键id使用外键(foreign)生成机制,引用代号为“student”对象的主键作为Card表的主键和外键。student在该映射文件的元素中进行了定义,它是Student对象的代号。元素的属性Constrained="true"表示Card引用了student的主键作为外键。
需要特别注意的是,Student类中要相应地加入一对get/set方法:
public Card getCard() {
return this.card;
}
public void setCard(Card card) {
this.card = card;
}
在Card类中也要相应地加入一对get/set方法:
public Student getStudent() {
return this.stu;
}
public void setStudent(Student stu) {
this.stu = stu;
}
在客户端测试程序中操纵Student和Card对象的方法如例程9-4所示。
例程9-4 客户端测试程序
package test;
import org.hibernate.*;
import org.hibernate.cfg.*;
import java.io.File;
import java.util.List;
public class Test {
public static void main(String[] args) {
File file = new File("D:\\eclipse3.2\\workspace\\HibernateTest
\\hibernate.cfg.xml");
Configuration conf = new Configuration().configure(file);
SessionFactory sf = conf.buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
//新建Student对象
Student stu = new Student();
stu.setName("Walker");
stu.setSex("male");
stu.setAge(22);
//新建Card对象
Card card = new Card();
card.setName("Walker");
//设置Student对象与Card对象之间的关联
stu.setCard(card);
card.setStudent(stu); //此句不能省略,否则card将不知从何处取得主键值
try {
session.save(stu);
tx.commit();
session.close();
System.out.println("Data have been inserted into DB.");
} catch (HibernateException e) {
e.printStackTrace();
tx.rollback();
session.close();
}
}
}
运行以上代码后,将会在t_student表和t_card表中插入相应的数据。
2.以外键关联
以外键关联的要点是:两个实体各自有不同的主键,但其中一个实体有一个外键引用另一个实体的主键。例如,假如Student和Card是外键关联的一对一关系,它们在数据库中相应的表分别是t_student表和t_card表,t_student表有一个主键id,t_card表有一个主键id和一个外键stu_id,此外键对应student表的主键id。
Student的映射文件Student.hmb.xml见例程9-2。但Card的映射文件Card.hbm.xml要做相应变动,如例程9-5所示。
例程9-5 Card.hbm.xml
-------------------------------------------------- ---------------------------------------
-----------------------------
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mappin g-2.0.dtd">
<hibernate-mapping>
<class name="test.Card" table="T_CARD" lazy= "true">
<id name="id" >
<generator class="increment" >
</id>
<property name="name" column="NAME" type="string" />
</class>
</hibernate-mapping>
在例程9-5中,元素的name属性声明外键关联对象的代号,class属性声明该外键关联对象的类,column属性声明该外键在数据表中对应的字段名,unique属性表示使用DDL为外键字段生成一个唯一约束。
以外键关联对象的一对一关系,其实本质上变成了一对多的双向关联了,应直接按照一对多和多对一的要求编写它们的映射文件。当元素的unique属性设定为true,多对一的关系实际上变成了一对一的关系。
在客户端程序中操纵外键关联一对一关系的对象的方法见例程9-4。
发表评论
-
windows内存结构
2012-01-20 08:13 706windows内存结构 2011年06 ... -
内存映射文件
2012-01-20 08:13 723内存映射文件 2010年07 ... -
.net设计规范(四) 成员设计
2012-01-20 08:13 533.net设计规范(四) 成员设计 2011年04月27日 ... -
使用 OProfile for Linux on POWER 识别性能瓶颈
2012-01-20 08:13 634使用 OProfile for Linux on POWER ... -
并行计算--并发构造纵览
2012-01-20 08:13 646并行计算--并发构造纵览 2010年10月22日 作者简 ... -
利用VBS创建快捷方式
2012-01-19 13:29 779利用VBS创建快捷方式 2010年06月19日 利用VB ... -
VBS利用SendKeys输入中文字符的方法
2012-01-19 13:29 977VBS利用SendKeys输入中文 ... -
谈VBS在Hacking中的作用-挑选网速快的肉鸡
2012-01-19 13:29 543谈VBS在Hacking中的作用-挑选网速快的肉鸡 2011 ... -
VBS整人代码 很多 测试把我给整安逸了
2012-01-19 13:29 627VBS整人代码 很多 测试把我给整安逸了 2010年08月2 ... -
利用VBS让QQ永远在线
2012-01-19 13:29 783利用VBS让QQ永远在线 201 ... -
delphi经典技艺
2012-01-17 03:19 704delphi经典技艺 2012年01月10日 http: ... -
行云流水
2012-01-17 03:19 605行云流水 2010年06月03日 行至水穷处,坐看云起 ... -
Android
2012-01-17 03:19 602Android 2010年06月30日 经过近段时间的观 ... -
学习光盘刻录必备基础知识
2012-01-17 03:18 690学习光盘刻录必备基础 ... -
最新【动漫爱好者系统】无忧GHOSTXP_SP3动漫主题装机版 V2010.10
2012-01-17 03:18 597最新【动漫爱好者系统】无忧GHOSTXP_SP3动漫主题装机版 ... -
全新的 2012
2012-01-16 01:53 549全新的 2012 2012年01月02日 新年第一天上班 ... -
【原创地带】职业病
2012-01-16 01:53 616【原创地带】职业病 20 ... -
《那些年丶不堪回首》③
2012-01-16 01:52 652《那些年丶不堪回首》 ... -
寻找异常退出终端上的进程
2012-01-11 01:49 701寻找异常退出终端上的进程 2011年09月01日 个别t ... -
notes on 'expert oracle'-no.4: memory areas-chenjianjx的专栏-iteye技术网站
2012-01-11 01:49 572notes on 'expert oracle'-no.4: ...
相关推荐
2. ... 3. }] 1. { 4. }, 6. } 2. didReceiveRemoteNotification:(NSDictionary *)use
深入浅出CGlib-打造无入侵的类代理 - llying - ITeye技术网站
javaMD5加密及登录验证(备忘) - Hibernate - Java - ITeye论坛.mhtjavaMD5加密及登录验证(备忘) - Hibernate - Java - ITeye论坛.mhtjavaMD5加密及登录验证(备忘
ice最简单实现 ruby调用ice接口 - Ruby - language - ITeye论坛
这是我在iteye网站的技术博客
java_web开发_高并发处理_-_-_ITeye技术网站.pdf
eclipse开发环境(支持tomcat、maven、jetty、JBoss) - - ITeye技术网站
Spring的JdbcTemplate插入操作返回主键ID的方法 - - ITeye技术网站
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。:copyright: 20032017 ITey
tomcat6使用DBCP和blob出现ClassCastException解决方法
js中escape对应的C#解码函数 - Corrinejtt - ITeye
从零开始学Spring Boot,没有...(15)Spring Boot使用Druid和监控配置【从零开始学Spring Boot】 http://412887952-qq-com.iteye.com/blog/2292362 16)Spring Boot使用Druid(编程注入)【从零开始学Spring Boot】 ...
1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型 2.__weak只能在ARC模式下使用,也只能修饰对象(NSSt
NULL 博文链接:https://yuemeiqing2008-163-com.iteye.com/blog/1912881
NULL 博文链接:https://dreamzhong.iteye.com/blog/1200387
NULL 博文链接:https://dreamzhong.iteye.com/blog/1200430
NULL 博文链接:https://jiajiabook-qq-com.iteye.com/blog/1262459
NULL 博文链接:https://wang-peng1.iteye.com/blog/2335888
NULL 博文链接:https://dreamzhong.iteye.com/blog/1200915