HibernateTemplate 的 两个 execute 方法区别

来源:互联网 发布:ie优化公司 编辑:程序博客网 时间:2024/06/05 21:03

HibernateTemplate 在Spring2.5以前 有两个 execute 方法:


1.execute(HibernateCallback)
2.execute(HibernateCallback action, boolean enforceNativeSession)

区别如下:

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


java代码:

private boolean exposeNativeSession = false;


execute方法内部:

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

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


java代码:


public Criteria getExecutableCriteria(Session session) {
impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring传递的是Proxy
return impl;
}

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


java代码:


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);}




在Spring2.5以后的HibernateTemplate中,第二个execute方法已经Deprecated了,被 executeWithNativeSession 方法取代
原创粉丝点击