贯通HIBERNATE开发读书笔记.docx
- 文档编号:5990379
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:45
- 大小:58.29KB
贯通HIBERNATE开发读书笔记.docx
《贯通HIBERNATE开发读书笔记.docx》由会员分享,可在线阅读,更多相关《贯通HIBERNATE开发读书笔记.docx(45页珍藏版)》请在冰豆网上搜索。
贯通HIBERNATE开发读书笔记
转自:
《贯通HIBERNATE开发》的读书笔记-关联关系映射1
阿堂发现,为了更好的巩固自己所学习的知识,便于日后学习和查阅,觉得记读书笔记非常重要,同时,我想,也会对其它学习hibernate的朋友会有所帮助的。
下面,阿堂会作一些系列的读书笔记,有说明和相关源码及运行结果,不正确的地方,欢迎朋友们跟帖评论,我会及时回复的
本篇主要是一些及基础知识的讲解,就没有说到很详细了
实体--关系模型是关系数据库理论中用到的基础概念,其作用是用来表示数据模型中的概念模型,是现实世界向虚拟世界的第一步转换。
实体是现实世界中的事物,而各种实体之间的联系便是关系。
实体之间的关系通常有:
一对一,一对多,多对多等
用来描述实体--关系模型的常用工具是实体--关系图(Entity-RelationshipGraph),在E-R图中,用矩形表示实体,用菱形表示实体之间的关系,用圆角表示实体或关系的属性。
类之间的关系包括:
关联、信赖、泛化、聚合等四类
1.关联
对于两个相对独立的对象,当一个对象的示例与另一个对象的一些特定的示例存在固定的对应关系时,这两个对象之间为关联关系。
2.依赖
对于两个相对独立的对象,当一个对象负责构造另一个对象的示例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
3.泛化
表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。
4.聚合
当对象A 实加入到对象B中,成为对象B的组成部分,对象B和对象A之间的为聚合关系,强调的是整体与部分之间的关系。
在了解具体映射方式及其配置之前,我们先来了解几个概念
1.不用连接表的关联及使用连接表的关联
不用连接表的情况
Teacher(TNo,TName,TTel)//TNo是主键
Lesson(Lno,TNo,LName) //Lno是主键TNo是Teacher表的外键
使用连接表的情况
Teacher(TNo,TName,TTel)
Lesson(Lno,LHour)
TeacherLesson(TNo,LNo) //建立一个关联的第三方表
2.单向关联和双向关联
根据是否存在关联关系所链接的双方都能导航到对方,将关联关系分为单向关联和双向关联两种类型。
单向关联只能从相互关联的一方导航到另一方。
双向关联可以从相互关联的任意一方导航到另一方。
如教师和课程之间的关联。
单向关联中,仅在课程类这一方声明了讲授该课程的所有教师的集合。
双向关联中,在教师和课程双方都对与之关联的课程列表与教师列表进行了声明
《贯通HIBERNATE开发》的读书笔记-关联关系映射2
单向多对一关联
在关系型数据库理论中,“多对一”关联同于“一对多”关联,且为了消除数据冗余,在两个关系之间不存在“多对多”关联,“多对多”关联要通过连接表来实现。
因此在关系型数据库中只有“一对一”和“一对多(多对一)”,且都是单向的。
而在hibernate当中,为了保证关联双方的映射可以通过多种方式进行,“单向一对多”关联和“单向多对一”被认为是两种不同的关联,其主要区别是在于哪个表的映射文件中进行
由于“单向一对多”关联的应用比较少见并不被hibernate推荐使用,下面仅对"单向多对一"关联进行说明
对于
name(必需):
设定“many”方所包含的“one”方所对应的持久化类的属性名
column(可选):
设定one方的主键,即持久化类的属性对应的表的外键
class(可选):
设定one方对应的持久化类的名称,即持久化类属性的类型
not-null(可选):
如果为true,,表示需要建立相互关联的两个表之间的外键约束
cascade(可选):
级联操作选项,默认为none
单向多对一(manytoone)关联是最常见的单向关联关系。
假设多个人(Person)可以有一个住址(Address),我们只关心人实体找到对应的地址实体,而无须关心从某个地址找到全部用户.
下面是将Person.hbm.xml和Address.hbm.xml文件合并到一个Chapter801.hbm.xml文件
Chapter801.hbm.xml映射文件
name="hibernate.wizard.chapter8.Person" table="C8_Person" schema="dbo" > name="personId" type="java.lang.String" column="personId" > --Associations--> column="addressId" class="hibernate.wizard.chapter8.Address" not-null="true" cascade="none" />
name="hibernate.wizard.chapter8.Address" table="C8_Address" schema="dbo" > name="addressId" type="java.lang.String" column="addressId" > name="addressName" type="java.lang.String" column="addressName" not-null="false" length="50" > --Associations-->
持久化类
Person.hbm.xml文件定义了一个
由于Person类与Address类是“多对一”的关系。
因此需要在Person类中声明一个Address类型的地属性address,以实现从一个Person对象导航到与之相关联的Address对象的目的。
为了使Person对象与Address对象关联,还需要为Person类构造一人带有Address类型的参数的构造函数
Person类
publicclassPersonimplementsSerializable{
privateStringpersonId;
privateStringaddressId;
privateAddressaddress; //声明了Address类型的属性
publicPerson(StringpersonId,StringaddressId){
this.personId=personId;
this.addressId=addressId;
}
publicPerson(StringpersonId,Addressaddress){
this.personId=personId;
this.addressId=address.getAddressId();
this.address=address;
}
publicPerson(StringpersonId){
this.personId=personId;
}
publicPerson(){
}
publicStringgetPersonId(){
returnthis.personId;
}
publicvoidsetPersonId(StringpersonId){
this.personId=personId;
}
publicStringgetAddressId(){
returnthis.addressId;
}
publicvoidsetAddressId(StringaddressId){
this.addressId=addressId;
}
publicStringtoString(){
returnnewToStringBuilder(this)
.append("personId",getPersonId())
.toString();
}
publicAddressgetAddress(){
returnaddress;
}
publicvoidsetAddress(Addressaddress){
this.address=address;
}
}
Address类
publicclassAddressimplementsSerializable{
privateStringaddressId;
privateStringaddressName;
// privateSetpeople=newHashSet(); //双向一对多关联时才用
publicAddress(StringaddressId,StringaddressName){
this.addressId=addressId;
this.addressName=addressName;
}
publicAddress(){
}
publicStringgetAddressId(){
returnthis.addressId;
}
publicvoidsetAddressId(StringaddressId){
this.addressId=addressId;
}
publicStringtoString(){
returnnewToStringBuilder(this)
.append("addressId",getAddressId())
.toString();
}
publicStringgetAddressName(){
returnaddressName;
}
publicvoidsetAddressName(StringaddressName){
this.addressName=addressName;
}
publicSetgetPeople(){
returnpeople;
}
publicvoidsetPeople(Setpeople){
this.people=people;
}
}
单向多对一关联测试
publicclassManyToOneTest{
Sessionsession;
Transactiontx;
publicstaticvoidmain(String[]args){
ManyToOneTestutil=newManyToOneTest();
util.insert();
}
publicvoidinsert(){
try{
session=HibernateUtil.getSession();
}catch(HibernateExceptionex){
System.out.println(ex);
}
tx=session.beginTransaction();//开始事务
//无级联更新
//保存Address
Addressaddr=newAddress("0001","云山路"); //addr是临时对象
session.save(addr); //addr已变成持久化对象
session.flush(); //刷新缓存,将数据提交
System.out.println("成功保存Address...");
//保存Person,与上一个Address关联
Personp1=newPerson("00001",addr);
Personp2=newPerson("00002",addr);
session.save(p1);
session.save(p2);
//加下面语句,下面的打印语句就不会出现在insert语句的前面了
session.flush();
System.out.println("成功保存Person...");
ArrayListresult=(ArrayList)session.createQuery("fromhibernate.wizard.chapter8.Personasp"+
"wherep.personId='00001'").list();
for(inti=0;i Personp=(Person)result.get(i); System.out.println("---personId---addressId---addressName"); System.out.println("---"+p.getPersonId()+"---"+p.getAddressId()+"---"+p.getAddress().getAddressName()); } mit();//提交事务 session.close();//关闭session } } 运行结果 初始化SessionFactory成功。 Hibernate: insertintodbo.C8_Address(addressName,addressId)values(? ? ) 成功保存Address... Hibernate: insertintodbo.C8_Person(addressId,personId)values(? ? ) Hibernate: insertintodbo.C8_Person(addressId,personId)values(? ? ) 成功保存Person... Hibernate: selectperson0_.personIdaspersonId2_,person0_.addressIdasaddressId2_fromdbo.C8_Personperson0_whereperson0_.personId='00001' ---personId---addressId---addressName ---00001---0001---云山路 建立单向多对一关联需要注意以下几点问题 1.在many方的映射文件中,使用 2.many方的持久化类中必须声明one方对应的持久化类的属性,用于实现多对一的导航,如上例中的privateAddressaddress; 3.应用程序中必须创建many方到one方的关联,示例中使用带有one方对应的持久化类的参数类型的构造函数是一种方式,另外也可以直接使用many方的set方法创建关联,如pl.setAddress(addr) 4.级联操作定义在 《贯通HIBERNATE开发》的读书笔记-关联关系映射3 双向多对一关联 "双向多对一"或“双向一对多”关联是一种最常见的关联关系,由于建立双向联系,无论是“many”方还是“one”方,都可以通过相关的属性导航到对方,因此本节仅对“双向多对一”关联进行介绍 (多对人具有一个相同的地址) 映射文件 hibernate使用 映射文件 name="hibernate.wizard.chapter8.Person" table="C8_Person" schema="dbo" > name="personId" type="java.lang.String" column="personId" > --Associations--> column="addressId" class="hibernate.wizard.chapter8.Address" not-null="true" cascade="none" /> name="hibernate.wizard.chapter8.Address" table="C8_Address" schema="dbo" > name="addressId" type="java.lang.String" column="addressId" > name="addressName" type="java.lang.String" column="addressName" not-null="false" length="50" > --Associations--> --利用set集合映射实现一对多关联--> 说明: “双向多对一”关联与上一节中的“单向多对一”关联在映射文件方面的主要区别仅仅在于: 在one方增加了一个“一对多”的映射,该映射使用 持久化类 相应地,为了实现双向关联,必须在one方的持久化类中添加对于many方的声明。 Person类的实现与“单向多对一”关联中相同 Person类 publicclassPersonimplementsSerializable{ privateStringpersonId; privateStringaddressId; privateAddressaddress; //声明了Address类型的属性 publicPerson(StringpersonId,StringaddressId){ this.personId=personId; this.addressId=addressId; } publicPerson(StringpersonId,Addressaddress){ this.personId=personId; this.addressId=address.getAddressId(); this.address=address; } publicPerson(StringpersonId){ this.personId=personId; } publicPerson(){ } publicStringgetPersonId(){ returnthis.personId; } publicvoidsetPersonId(StringpersonId){ this.personId=personId;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贯通 HIBERNATE 开发 读书笔记