老问题,hibernate的延迟加载问题。DAO模式操作数据,导致session关闭,无法获取需要延迟加载的对象,大家有啥解决办法?把lazy=“false”?感觉性能开销大。<set name="works" inverse="true">
<key column="archiveid" />
<one-to-many class="Work"/>
</set>
<key column="archiveid" />
<one-to-many class="Work"/>
</set>
<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>
只有用hql?刚接触hibernate,感觉hibernate这样的问题会导致和dao的矛盾啊
1.设置fetch=FetchType.LAZY
2.在多的一方对象上设置Batch的size(这种方法可以一次取多个,不用一次取一个,但是也取了N/size多次)
3.用HQL的left join(这种方法应该最好)
4.使用QBC(+QBE)(方法不是很直接)
为什么LZ用的还是XML,现在Hibernate不都用的是annotation了吗!?
要获取延时加载的对象,就在DAO中,查询出主类后,手动把set再加载一下。举例如下:
假设Foo有个works 是个需要延时加载的set
Foo foo = (Foo ) this.getHibernateTemplate().get(Foo .class, fooId);
if(null != foo) {
Hibernate.initialize(foo.getWorks());
}
return ...