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

  • 相关阅读:
    jquery实现页面的搜索功能
    url中的查询字符串的参数解析
    5.14日学习内容1:jquery表单相关知识
    5.12日北京“咖啡陪你”咖啡吧学习笔记
    layui基础上的tree菜单动态渲染;
    H5area的热区锚点随着图片的尺寸而变化
    Python3基础 raise 产生RuntimeError 异常
    Python3基础 raise + 指定类型异常+异常的解释 产生特定类型异常
    Python3基础 判断变量大于一个数并且小于另外一个数
    Python3基础 内嵌函数 简单示例
  • 原文地址:https://www.cnblogs.com/liuhouhou/p/2383315.html
Copyright © 2011-2022 走看看