Hibernate lazy属性

  一对多情况下读取父类的子集合时,hibernate lazy属性在其中的影响进行总结。(以下代码运行在jdk1.5,jboss eclipse ide 1.5hibernate 3.1环境下)
假设有:父类 Person   (含有Set类型属性Address)
子类 Address(碰巧集合的名字和子类的名字都是Address,不要混淆了)Person.hbm.xml   主要片段:

<id name="idx"  column="idx"  type="long">

 <generator class="identity"/>
</id>

<property  name="age"  type="int" update="true" insert="true"column="age"/>
<property  name="name"  type="java.lang.String" update="true"insert="true"
column="name"/>

<set name="address" table="address"  lazy="true"  cascade="none"  sort="unsorted">
<key >
<column name="personidx"/>
</key>
<one-to-many class="com.abc.common.pojo.Address"/>

</set>

session 的周期内,无论lazy 设为true or false, 不会有任何限制。访问父子数据的代码如下所示        
      //
打开session  
      session = HibernateUtil.currentSession();

      PersonDAO dao = new PersonDAO();
      Person person = null;

      person = (Person)dao.findByPrimaryKey(4);
      Set addressSet = person.getAddress();

     Address[] addressAry = new Address[addressSet.size()];
     Address address = null ;
     addressSet.toArray(addressAry);
    
     for(int i=0 ;i<addressAry.length;i++){
                     ................      
      }
    //session
关闭
     session.close();
      if (session.isOpen()){
           HibernateUtil.closeSession();
     }

(2)
session的周期外,访问父子数据的代码如下所示
      //
打开session  
      session = HibernateUtil.currentSession();

      PersonDAO dao = new PersonDAO();
      Person person = null;

      person = (Person)dao.findByPrimaryKey(4);
  
      session.close();
    
      //session
关闭之后才访问person的子集
      Set addressSet = person.getAddress();

     Address[] addressAry = new Address[addressSet.size()];
     Address address = null ;
     addressSet.toArray(addressAry);
    
     for(int i=0 ;i<addressAry.length;i++){
                     ................      
      }
      if (session.isOpen()){
           HibernateUtil.closeSession();
     }

   
此时,上述代码的运行结果根据lazy的设置的不同而不同
lazy=false
   
结果:可以访问得到PersonAddress的数据
lazy= true
    
根据代码的写法有不同
     (1)
代码其他处不做任何处理,则抛出异常
          org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:
         
。。。。。。
     (2)
如果做一些处理如下,将上述那段代码中的"留待后续处理"换成以下代码
            Hibernate.initialize(person.getAddress());  
则可以访问得到PersonAddress的数据
         
实际编写时,不会象上述这样的写法,即将
          Hibernate.initialize(person.getAddress());
person.getAddress()在同一个方法里面调用。他们往往出现在应用程序的不同层次中(前者出现在DAO层居多,而后者则出现在web层居多).


(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值