回调方法提供了session作为参数有了session就可以自由的使用Hibernate API编程了使用了spring的之后代码修改如下
web层代码
java代码
DetachedCriteria detachedCriteria = DetachedCriteria
forClass(Department
class);
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 = detachedCriteria
getExecutableCriteria(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;
}
[] [] []