在一对多的情况下。Class和Student为 one-to-many 映射关系
在class班级对象中,存在如下映射
<set
name="students"
cascade="all-delete-orphan"
inverse="true"
lazy=”true”
outer-join="true"
>
<key column="classid" />
<one-to-many class="cn.tutorinfo.domain.Student" />
</set>
无论 lazy设置为true还是 false 只要设置了outer-join 为true ,将采用左外连接检索策略检索class关联的 student对象,发送如下SQL语句:
select
classinfo0_.id as id0_1_,
classinfo0_.class_name as class2_0_1_,
classinfo0_.info as info0_1_,
students1_.classid as classid3_,
students1_.id as id3_,
students1_.id as id1_0_,
students1_.name as name1_0_,
students1_.age as age1_0_,
students1_.classid as classid1_0_
from
testdb.class_info classinfo0_
left outer join
testdb.student students1_
on classinfo0_.id=students1_.classid
where
classinfo0_.id=?
如果outer-join 不设置 (默认就是不设置),只设置lazy属性,则按照lazy属性的设置进行,lazy默认是false延迟加载,如果设置为true 则立即检索全部相关的student对象
|
Lazy属性 |
Outer-join属性 |
检索策略 |
|
True (默认) |
False |
延迟检索 |
|
False |
False |
立即检索 |
|
True |
True |
迫切左外连接 |
|
False |
Ture |
迫切左外连接 |
Hibernate3 的<set >一对多映射中 默认lazy=true , outer-join=false.即 默认采用延迟检索机制
在多对一映射关系中,比如student对象中有如下的映射:
<many-to-one name="classInfo"
class="cn.tutorinfo.domain.ClassInfo"
cascade="save-update"
>
<column name="classid" />
</many-to-one>
一个student只属于一个班级,一个班级有多个student.
在hibernate3中,针对关联对象,默认的检索机制就是延迟检索.
Many-to-one 映射中,同样可以设置outer-join属性,对于关联的class对象,采用如下检索方式
|
Student.hbm.xml中<many-to-one>元素的outer-join属性 |
ClassInfo.hbm.xml的<class>类级别的lazy属性 |
检索Student对象时对关联的classInfo对象使用的策略 |
|
Auto (默认值) |
True (默认) |
延迟检索 |
|
Auto (默认值) |
False |
迫切左外连接 |
|
True |
True |
迫切左外连接 |
|
True |
False |
迫切左外连接 |
|
False |
True(默认) |
延迟检索 |
|
False |
False |
立即检索 |
总结:
对于多对以或者一对一 这样的关联,应该优先考虑使用外连接检索策略,即将outer-join设置为true。一般我们在获取对象时候,在大多数的业务逻辑情况下,同时也会获取关联的数据(外键所表示的值没有实际意义,比如实际中,获取学生信息时,我们希望立即获取他的班级信息,但当前只获取了学生所在的班级编号,但并不知道班级名,所以我们可以使用做外连接同时获取,这样比立即检索少用了sql语句)。
当然,如果仅仅是获取学生的用户信息,不需要立即获取所在的班级信息,可以考虑使用延迟加载的策略。即默认的策略就是如此。
另外,hql中指定的检索策略,会忽略配置文件中相关的检索策略
本文深入探讨了在一对多映射关系中,特别是使用Hibernate框架时,如何通过设置外连接检索策略和懒加载属性来优化数据检索效率。详细解释了外连接检索策略如何与懒加载机制相结合,以减少不必要的SQL查询,并在不同场景下推荐最佳实践。
2013

被折叠的 条评论
为什么被折叠?



