熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Hibernate3的DetachedCriteria支持[2]

2013-11-23 20:49:12  來源: Java開源技術 

  回調方法提供了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;
}

[]  []  []  


From:http://tw.wingwit.com/Article/program/Java/ky/201311/29141.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.