HIbernate关联映射

Hibernate关联映射

表与表的关联关系

在软件开发中,类与类之间最普遍的关系就是关联关系,而且关联是有方向的。

一对一:必须有唯一的标识符

一对多:在多方添加外键指向一方的主键

多对多:创建第三张表,中间表至少有两个字段,分别作为外键指向多对多双方

主键.

建立一对多双向关联关系

当类与类之间建立了关联,就可以方便地从一个对象导航到另一个对象,或者

通过集合导航到一组对象。

配置一对多关联

1分别创建两个实体类

Hibernate要求在持久化类中定义集合类属性时,必须把属性声明为接口

类型,如java.util.Set可以指定泛型java.util.Set<表名>

多方实体类需要添加一方实体类的集合

2分别创建实体类和表的映射关系

多方添加外键指向一方主键

由于多方表中没有直接与集合属性对应的字段,因此不能使用<property>

元素来映射集合属性,而要使用<set>元素

<setname="cout">

<keycolumn="uc"/>

<one-to-manyclass="entity.Cour"/>

</set>

<set>元素的name属性:设定持久化类的属性名

<set>元素还包含两个子元素:

1.<key>元素:column属性设定与所关联的持久化类对象的表的外键,

2.<ont-to-many>元素:class属性设定与所关联的持久化类。

Hibernate根据以上映射代码获得一下信息:

1.<set>元素表名多方类的集合属性为java.util.Set集合类型

2.<one-to-many>子元素表名集合中存放的是一组集合对象

3.<key>子元素表明一方表通过外键参照多方表

3把映射关系添加到核心配置文件即可

4添加一个用户和添该用户的两个订单

双向关联联系下的增删改查(级联)

1.cascades属性

用于映射持久类之间关联关系的元素,<set>,<many-to-one>和<one-to-one>

都有一个cascade属性,用于指定如何操作与当前对象关联的其他对象

孤子删除操作cascade="delete-orphan"

当customer.hbm.xml的<set>元素的cascade属性取值为all-delete-orphan,

Hibernate会按照如下方式处理customer对象:

1.当保存或更新customer对象时,级联保存或更新所有关联的order对象,

相当于save-update.

2.当删除customer对象时,级联删除所有的order对象,相当于delete。

3.删除不再和customer对象关联的所有order对象。

当关联双方存在父子关系时,就可以把父方的cascade属性设为all-delete-orphan.

2.<set>元素的inverse属性

术语“inverse”直译为“反转”,在Hibernate中,inverse属性制定了关联关系中方向

通过inverse属性来设置由双向关联的哪一方来维护表和表之间的关系,inverse=false的为主动方,inverse=true的为被动方,由主动方负责维护关联关系。

在one一方设置inverse=true,由集合端管理关系。

配置inverse=”true”:在那一端配置.那么那一端放弃了外键的维护权.

一般情况下,一的一方去放弃.

建立多对多关联关系

必须创建一个中间表,并且中间表由两个多方表的主键组成

双向两端都使用集合属性

双向关联必须使用中间表

集合属性应增加key子元素用以映射外键列,集合元素里应增加many-to-many子

元素关联实体类

在双向关联的两边都需指定连接表的表名及外键列的列名,两个集合元素的set的table元素的值必须指定,而且必须相同

多对多关系的级联与一对多的相同

1、创建了学生和课程的实体类,及相关的映射文件

(多对多,必须由一方主动放弃外键的维护权,inverse="true")

2、把映射文件添加到核心配置文件

3、测试添加两个学生,两个课程,学生选择相关课程

Hibernate的检索方式

Hibernate的检索方式.doc

Select*fromuserwhereuname=?groupbysexhavingage>30orderbyagedesc

延迟加载

Hibernate查询多方对象时,立即查询并加载与之关联的一方对象,这种查询策略

称为立即加载,立即加载有两大不足:

1.select语句的数目太多,需要频繁地访问数据库,会影响查询性能

2.在应用程序只需要访问多方对象,而不需要访问一方对象的场合,加载一方

对象完全是多于的操作,这些多于的一方对象浪费了很多空间。

为了解决以上问题,Hibernate提供了延迟加载策略,

用于设定加载策略的lazy属性

类级别<class>元素中lazy属性的可选值为:true(延迟加载)和false(立即加载)

<class>元素中lazy属性的默认值为true

一对多关联级别<set>元素中的lazy属性的可选值为:true(延迟加载)和false(立即加载)以及extra(增

强延迟加载);<set>元素中的lazy属性的默认值为true

多对一关联级别<mant-to-one>元素中的lazy属性的可选值为:proxy(延迟加载)、no-proxy(无代理延

迟加载)和false(立即加载);<many-to-one>元素中的lazy属性的默认值为proxy

相关推荐