老问题,hibernate的延迟加载问题。DAO模式操作数据,导致session关闭,无法获取需要延迟加载的对象,大家有啥解决办法?把lazy=“false”?感觉性能开销大。<set name="works" inverse="true">
<key column="archiveid" />
<one-to-many class="Work"/>
</set>

解决方案 »

  1.   

    封装一个使用QBC查询的方法,用setFetchmode就可以解决延迟加载问题。
      

  2.   

    用hql的left join,inner join可以直接抓取延迟加载的关联对象。
      

  3.   

    假如是spring就可以通过
    <filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class>
    </filter>
    <filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
      

  4.   

    谢谢,项目没有用到spring,所以没办法用到OpenSessionInViewFilter。
    只有用hql?刚接触hibernate,感觉hibernate这样的问题会导致和dao的矛盾啊
      

  5.   

    这个应该是1+N问题,解决办法:
    1.设置fetch=FetchType.LAZY
    2.在多的一方对象上设置Batch的size(这种方法可以一次取多个,不用一次取一个,但是也取了N/size多次)
    3.用HQL的left join(这种方法应该最好)
    4.使用QBC(+QBE)(方法不是很直接)
    为什么LZ用的还是XML,现在Hibernate不都用的是annotation了吗!?
      

  6.   

    还是应该懒装的,不要牺牲系能。
    要获取延时加载的对象,就在DAO中,查询出主类后,手动把set再加载一下。举例如下:
    假设Foo有个works 是个需要延时加载的set
    Foo foo = (Foo ) this.getHibernateTemplate().get(Foo .class, fooId);
    if(null != foo) {
    Hibernate.initialize(foo.getWorks());
    }
    return ...