hibernate3中 一对多 和多对一的检索策略

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

 

你可能感兴趣的:(sql,xml)