现在的位置: 首页 > 综合 > 正文

hibernate lazy——延迟加载

2013年08月03日 ⁄ 综合 ⁄ 共 2615字 ⁄ 字号 评论关闭

 hibernate lazy策略可以使用在:
* <class>标签上,可以取值:true/false ,在hibernate3以上版本,默认是true
* <property>标签上,可以取值:true/false 需要类增强工具
* <set><list>标签上,可以取值:true/false/extra
* <one-to-one><many-to-one>单端关联上,可以取值:false/proxy/no-proxy

lazy概念:只有真正使用该对象时,才会创建,对于hibernate而言,正真使用的时候才会发出sql

hibernate支持lazy策略只有在session打开状态下有效

1 <class>标签上:

group.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.model">
   <class name="Group" table="group5" lazy="true" > //lazy,默认true,可不写
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native" />        
        </id>
        <property name="name" column="name" length="50" type="java.lang.String" />
    </class>
</hibernate-mapping>

测试用例:

public class LazyTest extends TestCase

{

public void testLoad1(){
   Session session = null;
   Transaction ta = null;
   try{
    session = HibernateUtil.getSession();
    ta = session.beginTransaction();

    //还没发出sql,lazy起延迟作用,若lazy=false,则发出sql

    Group g2 = (Group) session.load(Group.class, 1);
    Group g3 = (Group) session.get(Group.class, 1);   //不支持lazy
    System.out.println("group.id=" + g2.getId());     //还没发出sql,
    System.out.println("group.name=" + g2.getName()); //发出sql
    ta.commit();
   }catch(Exception e){
    e.printStackTrace();
    if(ta != null){
     ta.rollback();
    }
   }finally{
    //关闭session, user变为detached离线对象
    HibernateUtil.closeSession(session);
   }
   // System.out.println("group.name=" + g2.getName());
   // hibernate支持lazy策略只有在session打开状态下有效,所以此出Exception
}

}

<class>标签上的lazy特性只对普通属性起作用

<class>标签上的lazy不会影响到单端关联上的lazy特性

2.<set><list>标签上,可以取值:true/false/extra,默认是true

Classes.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zd.model">
    <class name="Classes" table="classes" >
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native" />
        </id>
        <property name="name" column="name" type="java.lang.String" />
       
<set name="students" lazy="true">

//可不配lazy,因默认是true

            <key column="class_id" />
            <one-to-many class="com.zd.model.Student" />
        </set>
    </class>

</hibernate-mapping>

测试用例:

public void testLoad1(){
   Session session = null;
   Transaction ta = null;
   try{
    session = HibernateUtil.getSession();
    ta = session.beginTransaction();
    Classes c = (Classes) session.load(Classes.class, new Integer(2));  //没有sql
    System.out.println("Class.name=" + c.getName());                    //发出一条sql,但不查 set
    Set stuSet = c.getStudents();                        

抱歉!评论已关闭.