zoukankan      html  css  js  c++  java
  • hibernate3中detachedCriteria.getExecutableCriteria的类型错误 cannot be cast to org.hibernate.engine.SessionImplemen

    CriteriaImpl criteria = (CriteriaImpl)detachedCriteria.getExecutableCriteria(session);

    就会抛出强制类型转换异常! 

      我跟踪了一下spring和Hibernate源代码,原因如下: 

      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 { 
       CriteriaImpl criteria = (CriteriaImpl)detachedCriteria.getExecutableCriteria(session);  } 
     }, true); 
    }  

    注意最后的那个true

  • 相关阅读:
    Single Number II
    Pascal's Triangle
    Remove Duplicates from Sorted Array
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Unique Paths
    Sort Colors
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Climbing Stairs
  • 原文地址:https://www.cnblogs.com/liuhouhou/p/2383315.html
Copyright © 2011-2022 走看看