java

位置:IT落伍者 >> java >> 浏览文章

Hibernate3的DetachedCriteria支持[2]


发布日期:2019年06月29日
 
Hibernate3的DetachedCriteria支持[2]

回调方法提供了session作为参数有了session就可以自由的使用Hibernate API编程了使用了spring的之后代码修改如下

web层代码

java代码

DetachedCriteria detachedCriteria = DetachedCriteriaforClass(Departmentclass);

detachedCriteriacreateAlias(employees e)add(Restrictionseq(name department))add(Restrictionsgt((eage) new Integer()));

departmentManagerfindByCriteria(detachedCriteria);

构造detachedCriteria作为参数传递给departmentManager

业务层代码使用springDepartmentManager的findByCriteria如下

java代码

public List findByCriteria(final DetachedCriteria detachedCriteria) {

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

public Object doInHibernate(Session session) throws HibernateException {

Criteria criteria = detachedCriteriagetExecutableCriteria(session);

return criterialist();

}

});

}

实际上也就是

java代码

Criteria criteria = detachedCriteriagetExecutableCriteria(session);

return criterialist();

而已

但是该程序代码执行会抛出强制类型转换异常!

我跟蹤了一下spring和Hibernate源代码原因如下

spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数但是实际上默认情况下HibernateTemplate传递给回调接口的session并不是orghibernateimplSessionImpl类而是SessionImpl类的一个Proxy类之所以替换成为一个Proxy类HibernateTemplate的注释说明Proxy提供了一些额外的功能包括自动设置CachableTransaction的超时时间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) {

implsetSession( (SessionImpl) session ); // 要求SessionImplSpring传递的是Proxy

return impl;

}

[] [] []

               

上一篇:Hibernate3的DetachedCriteria支持[1]

下一篇:Hibernate3的DetachedCriteria支持[3]