在HIbernateTemplate中我们可以看到一个核心的方法:
public Object execute(HibernateCallback action, boolean exposeNativeSession)
throws DataAccessException {
…………
…………
其中finally的定义为
finally {
…………
else {
// Never use deferred close for an explicitly new Session.
if (isAlwaysUseNewSession()) {
SessionFactoryUtils.closeSession(session);
}
else {
SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
}
从这里我们可以看到如果isAlwaysUseNewSession()为true的话,session将会在方法执行完之后关闭,那么我们知道
它的find(String ...)在调用CallBack的时候是这样实现的:
execute(new HibernateCallBack(){...},true);
因此,如果我们使用@OneToMany的话,设置FeatchType.LAZY在调用One.getMany()欲返回集合的话,会因为session
关闭而出现错误,当然知道了这一点解决起来就比较的简单了:
我们可以使用getHibernateTemplate().execute(new HibernateCallBack(){});因为在HibernateTemplate中
exposeNativeSession的默认值为false,当然,如果不放心的话,可以显式的调用:
execute(new HibernateCallBack(){},false);