欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 10:03:46
...

在一对多的情况下。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