版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料目 录1.1 hibernate框架中的一对一关联映射技术及应用示例21.1.1 一对一关联相关的技术实现方案21.1.2 采用“主键关联”实现本例中的“一对一”实体之间的关联51.1.3 创建数据库表和实体之间的映射配置文件91.1.4 对cascade级联属性的说明141.1.5 测试本示例项目的最终应用效果191.1 hibernate框架中的一对一关联映射技术及应用示例1.1.1 一对一关联相关的技术实现方案1、一对一关联的实现方案(1)一对一关联(2)一对一关联在hibernate中有两种方式l 主键关联不需借助外部字段,直接通
2、过两个表的主键进行关联。此时必须保证两个表的主键值一致(也就是id数据的值相等),在hibernate中通常是借助foreign标识符生成器策略来完成。在被动方中不需要进行如何的配置!简单来说,这种情况就是两个表的主键相等的内连接。 基于主键关联的单向一对一关联通常使用一个特定的id生成器foreign。 下面以“address-person”的“一 对一”的关联加以说明,其配置的方法。 在主动方中进行配置! person create table person ( personid bigint not null primary key )create table address ( per
3、sonid bigint not null primary key )注意:在“主键关联”中使用“foreign”表示与外键共享主键,也就是与person实体共享主键,而其中的“constrained”属性设定为true,则表示约束address的主键必须与person中对应数据的主键相同。l 唯一外键关联在主动方加入外键进行关联(如右图中,在book表中增加一个publishid字段),这样主动方与被动方的影射关系实际上就成了多对一的关联(请见后面的“多对一的关联”示例)。 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。 c
4、reate table person ( personid bigint not null primary key, addressid bigint not null unique )create table address ( addressid bigint not null primary key )注意:使用“唯一外键关联”来完成“一对一”的关联,其实就是限制“多对一”关系中,“多”的一方只能有一个参考至“一”的一方,也就是“多对一”关系的一个特例,这可以在映像文件中使用标签时,加上unique属性来设定。2、主键关联的实现原理和要求(1)要求主键关联不需要额外的表字段;如果两行是通
5、过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值! (2)示例说明比如说,对下面的employee和person进行主键一对一关联: 现在我们必须确保person和employee中相关的字段是相等的。 (3)实现的原理基于主键关联的单向一对一关联通常使用一个特定的id生成器foreign,我们使用一个被成为foreign的特殊的hibernate标识符生成策略。 employee . 一个刚刚保存的person实例被赋予和该person的employee属性所指向的employee实例同样的关键字值。 1.
6、1.2 采用“主键关联”实现本例中的“一对一”实体之间的关联1、在ms sqlserver的本例的数据库中增加一个数据库表publishcreate database database;use database;drop table publish;create table publish(publish_id int not null,publishname nvarchar(20) not null,publishaddress nvarchar(20) not null,constraint pk_ publish primary key (publish_id);insert publ
7、ish values(1, xxx, yyyy);insert publish values(2, xxx, yyyy);2、决定ebook和publish之间的关系显然,ebook是由某个出版社所出版,即ebook与publish之间为“一对一”的关系。其中的ebook类为主控方,而publish类为被动方。one to onepublishebook3、新增一个publish类,包名称为com.px1987.hexample.pobject增加下面的各个属性定义,并提供get/set方法private integer id;private string publishname;privat
8、e string publishaddress; 最后为下面的代码注意本例的主键类型设计为integerpackage com.px1987.hexample.pobject;public class publish private integer id;private string publishname;private string publishaddress;public publish(integer id, string newpublishname, string newpublishaddress)this.id = id;this.publishname = newpubli
9、shname;this.publishaddress = newpublishaddress;public publish()public integer getid() return id; public void setid(integer id) this.id = id; public string getpublishname()return this.publishname;public void setpublishname(string newpublishname)this.publishname = newpublishname;public string getpubli
10、shaddress()return this.publishaddress;public void setpublishaddress(string newpublishaddress)this.publishaddress = newpublishaddress;public boolean equals(object other) if (this = other) return true; if ( !(other instanceof publish) ) return false; return true; 1.1.3 创建数据库表和实体之间的映射配置文件1、为该实体类创建一个pub
11、lish.hbm.xml映射文件(1)新建publish.hbm.xml映射文件(2)该publish.hbm.xml映射文件的内容如下 注意:同时由于publish表中的publish_id的产生方式设置为“increment”,因此应该在该数据库表中首先有数据(如可以给出下面的示例数据)。否则将从1开始产生!(3)在hibernate.cfg.xml配置文件中增加对该文件的定义 java:comp/env/jdbc/datasource false org.hibernate.dialect.sqlserverdialect 2、实现ebook与publish之间的“一对一”的关联(1)修
12、改ebook.java类增加一个publish类型的成员属性package com.px1987.hexample.pobject;import java.util.*;public class ebook private integer id; private string ebookname; private char ebookkind; private float ebookprice;private publish publish = null;public publish getpublish()return this.publish;public void setpublish(
13、publish newpublish)this.publish = newpublish;public ebook() 。 /其它代码不变(2)在ebook.hbm.xml里面映射这个关联-“one-to-one”关系定义规则“one-to-one”关系定义比较简单,只需在主控方加以定义(本例为ebook类)。这里,我们的目标是由ebook对象获取其对应的publish对象。因此ebook对象是主控方,为了实现“一对一”关系,我们在ebook对象的映射文件ebook.hbm.xml 中加入标签节点,对publish对象进行一对一关联。(3)修改ebook.hbm.xml文件以增加下面的内容 p
14、ublish 注意:其中的cascade=none,表示不需要进行级连。(3)标签的说明参考hibernate的官方指导手册,下面给出标签的说明其中的各个属性的说明如下:(1) name:映射属性的名称。 (2) class(可选):被关联的类的名称,如果省略此属性,则通过反射机制得到与此属性名称一致的类。 (3) cascade(可选)表明操作是否从父对象级联到被关联的对象。(4) constrained(可选):表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序。 (5) ou
15、ter-join(可选):是否允许外连接抓取;默认是auto,关联对象没有采用proxy机制时使用外联接。 (6) property-ref(可选):指定关联类的一个属性,这个属性将会和本外键相对应。默认为关联类的主键。 (7) access(可选):hibernate用来访问属性的策略,默认是property.1.1.4 对cascade级联属性的说明1、作用hibernate 允许我们为每个关系映射指定级联形式,为所有的状态转换提供更复杂更精确的控制。hibernate读取声明的状态并自动级联操作到相关的对象-当主控方执行操作时,关联对象(被动方)是否同步执行同一操作。因为当hiberna
16、te持久化一个临时对象时,在默认情下,他不会自动持久化所关联的其他临时对象,如果希望当持久化对象时把他所关联的所有临时对象进行持久化的话:可以设置cascade属性。2、注意的问题l cascade的默认值为falsel 只有“关系标签”才有cascade属性:many-to-one,one-to-one ,any, set(map, bag, idbag, list, array) , one-to-many(many-to-many)。3、一个操作因级联cascade可能触发多个关联操作我们把前一个操作叫“主控操作”,而把后一个操作叫“关联操作”。cascade属性的可选值:l all:所
17、有情况下均进行关联操作。l none:所有情况下均不进行关联操作。这是默认值。l save-update:在执行save/update/saveorupdate时进行关联操作。l delete:在执行delete时进行关联操作。 具体执行什么“关联操作”是根据“主控操作”来决定的: “主控操作” “关联操作” session.saveorupdate - session.saveorupdate (执行saveorupdate实际上会执行save或者update) session.save - session.saveorupdate session.udpate - session.save
18、orupdate session.delete - session.delete4、为什么要提供级联操作-实现hibernate 的级联持久化级联持久化的特性能够保证相互关联的数据之间的完整性约束,并且级联在编程中经常接触,当主控表信息改变时,用来保证其关联表中数据同步更新。比如一个employee存放职员信息,一个 timecard存放职员的考勤信息,当从职员表中删除一个职员时,timecard表中对应的考勤信息已经没有意义,因为其所属的职员已不存在,如果继续留在timecard表中就成了没用的也称脏数据。理想的做法是在删除职员信息的同时将该职员信息对应的考勤信息也删除。在hibernate
19、中如果要达到这个效果只需要设置cascade属性值即可。当然是否进行级联关系要根据实际情况慎重考虑。5、各种设置的值的含义cascade属性设置为除了none(为从来不作级联操作)以外任何有意义的值, 它将把特定的操作传播到关联对象中,这个值就代表着hibernate基本操作的名称。create, merge, delete(为delete动作时作级联操作), save-update(为insert,update动作时作级联操作), evict, replicate, lock, refresh 以及特别的值delete-orphan和all(为所有变更动作都进行级联操作),并且可以用逗号分隔
20、符来合并这些操作,例如,cascade=create,merge,evict或 cascade=all,delete-orphan。6、根据ebook获得其关联的publish(1)在本测试用的hibernatedaobean.java中增加doinsertebookdatatodbrelation的方法public boolean doinsertebookdatatodbrelation() throws hibernateexception,java.io.unsupportedencodingexception session session=null;transaction tx=n
21、ull;trysession = hibernateutil.currentsession();/*下面的代码相当于我们执行了以下sql语句insert into ebook (ebook_id,ebookname,ebookkind,ebookpricfe) values (1, j2ee应用开发,1,7.4f) */tx= session.begintransaction();ebook oneebook = new ebook();/*对某些数据库系统如mssqlserver2000必须进行字符的编码转换,否则会出现中文乱码oneebook.setebookname(new string
22、(j2ee应用开发.getbytes(gb2312),iso8859-1);*/oneebook.setebookname(j2ee应用开发);oneebook.setebookkind(1);oneebook.setebookprice(7.4f);publish publish = new publish();publish.setpublishname(机械出版社);publish.setpublishaddress(北京朝阳);oneebook.setpublish(publish);session.save(oneebook); /保存该实体及其关连的实体mit(); c
23、atch(hibernateexception he) if ( tx!=null ) tx.rollback(); log.error(在doinsertebookdatatodb方法中出现了hibernateexception错误, he); throw he; finally/*这样你就可以随心所欲的多次调用hibernateutil.currentsession();,你每次都会得到同一个当前线程的session。不管是在你的servlet代码中,或者在servlet filter中还是在http结果返回之前,你都必须确保这个session在你的数据库访问工作完成后关闭。*/ hibe
24、rnateutil.closesession(); return true; (2)在本测试用的hibernatedaobean.java中增加根据ebook对象获得所对应的publish的方法 public arraylist doselectebookdatafromdbrelation(string selecthql) throws hibernateexceptionsession session=null;transaction tx=null; arraylist totalebooklist =new arraylist();trysession = hibernateutil
25、.currentsession();tx= session.begintransaction();list result = session.createquery(selecthql).list();for (int index = 0; index result.size(); index+) ebook oneebook = (ebook) result.get(index); totalebooklist.add(oneebook); system.out.println(该书所对应的出版社的信息为:); system.out.print(publish id=+oneebook.ge
26、tpublish().getid(); system.out.print(publish name=+oneebook.getpublish().getpublishname(); system.out.print(publish address=+oneebook.getpublish().getpublishaddress();mit(); catch(hibernateexception he) log.error(在doselectebookdatafromdb方法中出现了hibernateexception错误, he); throw he; finally hibern
27、ateutil.closesession(); return totalebooklist;1.1.5 测试本示例项目的最终应用效果1、修改web应用中的index.jsp中的测试代码为下面的内容%/*不带关联的测试代码* hibernatedaobean.doinsertebookdatatodbrelation(); java.util.arraylist totalebooklist=hibernatedaobean.doselectebookdatafromdbrelation(from ebook); for (int index = 0; index totalebooklist.size(); index+) com.px1987.hexample.pobject.ebook oneebook=(com.p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年因病致贫重病患者救助政策竞赛题库
- 2026年电子商务物流配送体系研究题库
- 2026年水资源保护与节水科普题库
- 2026年医保缴费基数申报题库
- 2026年村社农产品电商增收致富案例知识题库
- 2026年教育法下的教育公平问题研究
- 医疗卫生行业政策法规含测试题2026
- 2026年征兵心理测评进取心与成就动机题
- 2025年湘乡市社区工作者招聘考试真题及答案
- 2026年福建压力容器操作工考试工艺参数控制与日常巡检要点
- 电泳质量协议书范本
- 抢救柜管理制度
- 2025年福建省高考生物试卷真题(含答案解析)
- 2025闵行七宝镇村(合作社)、镇属公司公开招聘20人模拟试卷(含答案详解)
- 2025年空军军队文职技能岗考试采购员练习题及答案
- 涉毒违法犯罪警示教育课件大纲
- 甜点草莓少司课件
- 高校大创项目申报书撰写指南
- 2024-2025学年辽宁省丹东市第十九中学七年级下学期期中考试数学试题
- 幼儿园中班数学课《认识数字1-10》课件
- 2024广东海洋大学教师招聘考试真题及答案
评论
0/150
提交评论