贯通HIBERNATE开发读书笔记Word格式.docx

上传人:b****6 文档编号:18983782 上传时间:2023-01-02 格式:DOCX 页数:45 大小:58.29KB
下载 相关 举报
贯通HIBERNATE开发读书笔记Word格式.docx_第1页
第1页 / 共45页
贯通HIBERNATE开发读书笔记Word格式.docx_第2页
第2页 / 共45页
贯通HIBERNATE开发读书笔记Word格式.docx_第3页
第3页 / 共45页
贯通HIBERNATE开发读书笔记Word格式.docx_第4页
第4页 / 共45页
贯通HIBERNATE开发读书笔记Word格式.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

贯通HIBERNATE开发读书笔记Word格式.docx

《贯通HIBERNATE开发读书笔记Word格式.docx》由会员分享,可在线阅读,更多相关《贯通HIBERNATE开发读书笔记Word格式.docx(45页珍藏版)》请在冰豆网上搜索。

贯通HIBERNATE开发读书笔记Word格式.docx

Lesson(Lno,TNo,LName) 

//Lno是主键TNo是Teacher表的外键

使用连接表的情况

Teacher(TNo,TName,TTel)

Lesson(Lno,LHour)

TeacherLesson(TNo,LNo) 

//建立一个关联的第三方表

2.单向关联和双向关联

根据是否存在关联关系所链接的双方都能导航到对方,将关联关系分为单向关联和双向关联两种类型。

单向关联只能从相互关联的一方导航到另一方。

双向关联可以从相互关联的任意一方导航到另一方。

如教师和课程之间的关联。

单向关联中,仅在课程类这一方声明了讲授该课程的所有教师的集合。

双向关联中,在教师和课程双方都对与之关联的课程列表与教师列表进行了声明

《贯通HIBERNATE开发》的读书笔记-关联关系映射2

单向多对一关联

在关系型数据库理论中,“多对一”关联同于“一对多”关联,且为了消除数据冗余,在两个关系之间不存在“多对多”关联,“多对多”关联要通过连接表来实现。

因此在关系型数据库中只有“一对一”和“一对多(多对一)”,且都是单向的。

而在hibernate当中,为了保证关联双方的映射可以通过多种方式进行,“单向一对多”关联和“单向多对一”被认为是两种不同的关联,其主要区别是在于哪个表的映射文件中进行<

manytoone>

的配置,进行<

配置的一方便是“多”。

由于“单向一对多”关联的应用比较少见并不被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映射文件

<

hibernate-mapping>

class

name="

hibernate.wizard.chapter8.Person"

table="

C8_Person"

schema="

dbo"

>

<

id

personId"

type="

java.lang.String"

column="

>

generatorclass="

assigned"

/>

/id>

!

--Associations-->

 

many-to-onename="

Address"

addressId"

class="

hibernate.wizard.chapter8.Address"

not-null="

true"

cascade="

none"

/class>

C8_Address"

property

addressName"

false"

length="

50"

/property>

/hibernate-mapping>

持久化类

Person.hbm.xml文件定义了一个<

的关联,而Address.hbm.xml文件未定义的任何关联,说明可以从Person类单向关联到Address类。

由于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){

publicPerson(){

publicStringgetPersonId(){

returnthis.personId;

publicvoidsetPersonId(StringpersonId){

publicStringgetAddressId(){

returnthis.addressId;

publicvoidsetAddressId(StringaddressId){

publicStringtoString(){

returnnewToStringBuilder(this)

.append("

getPersonId())

.toString();

publicAddressgetAddress(){

returnaddress;

}

publicvoidsetAddress(Addressaddress){

this.address=address;

Address类

publicclassAddressimplementsSerializable{

privateStringaddressName;

// 

privateSetpeople=newHashSet();

//双向一对多关联时才用

publicAddress(StringaddressId,StringaddressName){

this.addressName=addressName;

publicAddress(){

getAddressId())

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"

session.save(p1);

session.save(p2);

//加下面语句,下面的打印语句就不会出现在insert语句的前面了

成功保存Person..."

ArrayListresult=(ArrayList)session.createQuery("

fromhibernate.wizard.chapter8.Personasp"

+

"

wherep.personId='

00001'

).list();

for(inti=0;

i<

result.size();

i++){

Personp=(Person)result.get(i);

---personId---addressId---addressName"

---"

+p.getPersonId()+"

+p.getAddressId()+"

+p.getAddress().getAddressName());

mit();

//提交事务

session.close();

//关闭session

运行结果

初始化SessionFactory成功。

Hibernate:

insertintodbo.C8_Address(addressName,addressId)values(?

?

成功保存Address...

insertintodbo.C8_Person(addressId,personId)values(?

成功保存Person...

selectperson0_.personIdaspersonId2_,person0_.addressIdasaddressId2_fromdbo.C8_Personperson0_whereperson0_.personId='

---personId---addressId---addressName

---00001---0001---云山路

建立单向多对一关联需要注意以下几点问题

1.在many方的映射文件中,使用<

标识进行关联映射的定义

2.many方的持久化类中必须声明one方对应的持久化类的属性,用于实现多对一的导航,如上例中的privateAddressaddress;

3.应用程序中必须创建many方到one方的关联,示例中使用带有one方对应的持久化类的参数类型的构造函数是一种方式,另外也可以直接使用many方的set方法创建关联,如pl.setAddress(addr)

4.级联操作定义在<

操作中,如果将cascade属性设为all或save-update,那么在应用程序中只需要用Session的sava方法持久化many方的对象即可,如session.save(p3)

《贯通HIBERNATE开发》的读书笔记-关联关系映射3

双向多对一关联

双向多对一"

或“双向一对多”关联是一种最常见的关联关系,由于建立双向联系,无论是“many”方还是“one”方,都可以通过相关的属性导航到对方,因此本节仅对“双向多对一”关联进行介绍

(多对人具有一个相同的地址)

映射文件

hibernate使用<

和<

set>

标记在映射文件中定义双向多对一关联。

--利用set集合映射实现一对多关联-->

setname="

people"

inverse="

all"

keycolumn="

/>

one-to-manyclass="

/set>

说明:

“双向多对一”关联与上一节中的“单向多对一”关联在映射文件方面的主要区别仅仅在于:

在one方增加了一个“一对多”的映射,该映射使用<

onetomany>

标记进行定义

相应地,为了实现双向关联,必须在one方的持久化类中添加对于many方的声明。

Person类的实现与“单向多对一”关联中相同

this.addressId=address.getAddressId();

this.address=address;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1