Hibernate Template简单描述

Hibernate Template还是比较常用的,于是我研究了一下spring Hibernate源代码,在这里拿出来和大家分享一下,希望对大家有用。

spring的Hibernate Template的execute方法提供的回调接口具有Session作为参数,但是实际上,默认情况下,Hibernate Template传递给回调接口的session并不是org.hibernate.impl.SessionImpl类,而是SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类,Hibernate Template的注释说明,Proxy提供了一些额外的功能,包括自动设置Cachable,Transaction的超时时间,Session资源的更积极的关闭等等。

private boolean exposeNativeSession = false;  


...  


execute方法内部:  


 



Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session)); 

但是遗憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl,但是spring传过来的却是一个Proxy类,因此就报错了。

public Criteria getExecutableCriteria(Session session) {  


impl.setSession( (SessionImpl) session );   


// 要求SessionImpl,Spring传递的是Proxy  


return impl;  


} 

解决方法,禁止Spring的Hibernate Template传递Proxy类,强制要求它传递真实的SessionImpl类,即给exexute方法增加一个参数,提供参数为true,如下:

public List findByCriteria(final DetachedCriteria detachedCriteria) {  


return (List) getHibernateTemplate().execute(new HibernateCallback() {  


public Object doInHibernate(Session session) throws HibernateException {  



Criteria criteria = detachedCriteria.getExecutableCriteria(session);  



return criteria.list();  


}  


}, true);  


} 

相关推荐