在一对多的情况下。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中指定的检索策略,会忽略配置文件中相关的检索策略