回調方法提供了session作為參數有了session就可以自由的使用Hibernate API編程了使用了spring的之後代碼修改如下
web層代碼
java代碼
DetachedCriteria detachedCriteria = DetachedCriteria
forClass(Department
class);
detachedCriteria
createAlias(
employees
e
)
add(Restrictions
eq(
name
department
))
add(Restrictions
gt((
e
age
)
new Integer(
)));
departmentManager
findByCriteria(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 = detachedCriteria
getExecutableCriteria(session);
return criteria
list();
}
});
}
實際上也就是
java代碼
Criteria criteria = detachedCriteria
getExecutableCriteria(session);
return criteria
list();
而已
但是該程序代碼執行會拋出強制類型轉換異常!
我跟蹤了一下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) {
impl
setSession( (SessionImpl) session ); // 要求SessionImpl
Spring傳遞的是Proxy
return impl;
}
[] [] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29141.html