chenssss 2017-02-23
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