Hibernate/Spring 4 升级后,ClassCastException Proxy36 无法转换为 SessionImplementor

2024-01-23

编辑:我不是在问whatClassCastException 是。我想知道在 Spring 4/Hibernate 4 的这个特定配置下,在 DetachedCriteria 中是什么导致了它。

我正在尝试将一些遗留代码升级到 Spring 4/Hibernate 4,但我遇到了困难,因为 Google 没有出现太多。

我正在尝试在一个非常简单的 Hibernate 存储库上运行 JUnit 测试,但失败了

java.lang.ClassCastException: com.sun.proxy.$Proxy36 cannot be cast to org.hibernate.engine.spi.SessionImplementor
    at org.hibernate.criterion.DetachedCriteria.getExecutableCriteria(DetachedCriteria.java:84)
    at com.my.app.rest.domain.repository.AbstractHibernateRepository$6.doInHibernate(AbstractHibernateRepository.java:163)
...

这发生在 Hibernate 中org.hibernate.criterion.DetachedCriteria class:

/**
 * Get an executable instance of Criteria to actually run the query.
 *
 * @param session The session to associate the built Criteria with
 *
 * @return The "executable" Criteria
 */
public Criteria getExecutableCriteria(Session session) {
    impl.setSession( (SessionImplementor) session );
    return impl;
}

当它尝试设置 Session(尝试将其转换为 SessionImplementor)时,它会抛出 ClassCastException。

我怀疑这可能是 AOP 问题,但不知道从哪里开始寻找。

我正在使用春天4.3.2.RELEASE和休眠4.3.5.Final.

休眠上下文.xml:

    <bean id="xxxSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

        <property name="dataSource" ref="xxxDataSource" />

        <property name="mappingResources">
            <list>
                <value>hibernate/xxxUploadDocResponseInfo.hbm.xml</value>
            </list>
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${xxx.hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${xxx.hibernate.showsql}</prop>
                <prop key="hibernate.hbm2ddl.auto">${xxx.hibernate.hbm2ddl}</prop>
                <prop key="format_sql">${xxx.hibernate.formatsql}</prop>
                <prop key="hibernate.query.substitutions">true 1, false 0</prop>

            </props>
        </property>
    <alias name="xxxSessionFactory" alias="sessionFactory" />
</bean>

交易上下文.xml:

<bean id="xxxTransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:advice id="xxxTxAdvice" transaction-manager="xxxDatasourceTransactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
        <!-- all methods begin with save have the transaction -->
        <tx:method name="save*" propagation="REQUIRED"/>
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="remove*" propagation="REQUIRED"/>
        <tx:method name="inactivate*" propagation="REQUIRED"/>
        <tx:method name="complete*" propagation="REQUIRED"/>
        <tx:method name="reset*" propagation="REQUIRED"/>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="flag*" read-only="true"/>
        <tx:method name="doWork*" propagation="REQUIRES_NEW" />
    </tx:attributes>
</tx:advice>

<bean id="xxxDatasourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <constructor-arg ref="xxxDataSource" />
</bean>

<aop:config>
    <aop:pointcut id="allBusiness" expression="execution(public * com.blah.xxx.rest.business.*Business.*(..))"/>
    <aop:advisor advice-ref="xxxTxAdvice" pointcut-ref="allBusiness"/>
</aop:config>

AbstractHibernateRepository.java:

public abstract class AbstractHibernateRepository<E extends Entity, S extends Serializable> extends HibernateDaoSupport {
...
       @SuppressWarnings("unchecked")
protected E get(final DetachedCriteria detachedCriteria) {
    return (E) getHibernateTemplate().execute(new HibernateCallback<E>() {

        public E doInHibernate(Session session) {

            Criteria criteria = detachedCriteria.getExecutableCriteria(session);
            criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
            return (E) criteria.uniqueResult();
        }
    });
}
...
}

升级到 Spring Boot 2.4.0 后,遗留代码面临同样的问题。通过使用修复entityManager.unwrap(SessionImplementor.class)在我的场景中检索用于 DetachedCriteria 的会话。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate/Spring 4 升级后,ClassCastException Proxy36 无法转换为 SessionImplementor 的相关文章

随机推荐

  • 如何从方法返回对对象的 const 引用? [复制]

    这个问题在这里已经有答案了 public Item getItem ulong itemId Item item items itemId return item 现在的问题是 被调用者getItem必须能够检索以下信息item持有 但不修
  • 多处理代码重复运行

    所以我希望使用 python 多处理模块创建一个进程 我希望它成为更大脚本的一部分 我还想从中得到很多其他东西 但现在我会满足于此 我从以下位置复制了最基本的代码多处理文档 https docs python org 3 6 library
  • 在 ExtJS 4 中具有相同视图并多次存储的最佳实践

    我想在 ExtJS 应用程序中同时拥有不同商店的同一视图的不同实例 目前 我在视口中创建了同一视图 Ext view View 的多个实例 但是在每个视图中都有不同的商店的最佳实践是什么 我发现的每个示例都在使用控制器的stores Con
  • MapKit (Swift 4) Xcode 9.2 - “无法从角 4 插入合法归属”

    我正在做一个处理 MapKit 的项目 我的问题是 当我运行该应用程序时 我收到 无法从第 4 角插入法律归属 的消息 错误 我可以采取什么解决方案来解决这个问题 error https i stack imgur com jw7rk pn
  • 使用 Tf Estimator 时如何获得可训练变量计数?

    我使用 tf 估计器框架创建了 CNN 分类器模型 但是 我无法访问模型中定义的变量 tf trainable variables 始终返回 0 如何使用 tf 估计器访问变量 特别是 我如何获得参数总数的计数 将所有变量的维度相加 谢谢
  • 自动使用相对于函数调用位置的 __LINE__ 和 __FILE__

    我有一个函数log text 这一切所做的就是写 text到数据库 我想包括 LINE and FILE 但不想像我现在那样每次都将其作为参数包含在内 function log text file null line null write
  • 无法使用面向 x64 的 VC++/VS2010 进行编译:LNK1158:无法运行 cvtres.exe

    作为一名 C 开发人员 我最近决定尝试编写一些 C 程序 主要是因为我发现了一个我想使用的有趣的 C API 几天前我写了一个非常简单的程序 在 x64 目标平台上编译它 运行它 一切都很顺利 然而 昨天我更改了一些代码 尝试编译它 但链接
  • ruby - 捆绑包安装/更新太慢

    我刚刚在 virtualbox 中运行的虚拟 ubuntu 12 04 32 位上安装了 RVM Ruby Rails 等 现在我遇到了我的第一个 Rails 项目的问题bundle install or bundle update需要很长
  • 连接到不存在的 mongodb 服务器不会抛出异常

    我正在尝试使用 Java 的 MongoDB 驱动程序 所以我只是创建了一个简单的应用程序来连接到 MongoDB 服务器并选择一个数据库 所以我创建了一个实例MongoClient并选择了一个 数据库 try MongoClient cl
  • 查找哪一行重复 data.frame 中的哪一行

    我有一个像这样的数据框 data frame matrix c 11 13 21 23 11 13 11 13 31 33 41 43 31 33 byrow TRUE ncol 3 现在我想知道哪一行是哪一行的重复项 返回具有重复行号最低
  • 将 docx 转换为 markdown 时如何避免 markdown 上的 img 大小标签?

    我正在使用 pandoc 1 16 0 2 转换 docx 文件 一切都很好 除了每个图像之后 尺寸属性在 teh 中显示为文本 media media image4 png width 3 266949912510936in height
  • 我将错误的数组长度传递给了函数。为什么我没有收到错误消息?

    我是初学者 学习c语言大约20天 我一直在使用 Youtube 来做这件事 我看到一个视频 其中有人告诉我 如果将数组传递给函数 那么第二个变量应该是数组的长度 我觉得这是不对的 我尝试了下面给出的代码 include
  • 如何使用 SSMS 连接到 SQL Server CE 文件

    我正在使用 SSMS 2012 并尝试连接到 Orchard 创建的 SDF 根据这个答案 https stackoverflow com a 1072324 128217 我应该能够选择SQL Server 精简版 as the 服务器类
  • F# 中最优雅的冒泡排序方式是什么?

    F 中最优雅的冒泡排序方式是什么 UPDATE 正如其中一个答案所指出的 冒泡排序在函数式语言中一开始就效率不高 一位幽默愤世嫉俗的评论者还指出 冒泡排序仅适用于列表很小且无论如何都已排序的情况 不过 我很好奇如何在 F 中编写巧妙的冒泡排
  • React Native 中最新的 doctor 命令的目的是什么

    我正在查看最新的 React Native 博客 其中他们介绍了 React Native 的 doctor 命令 从那里我唯一能理解的是为你做一些环境方面的事情 但我不明白目的 确切的目的是什么doctor反应本机命令 The docto
  • 使用 ColdFusion 加密 SagePay 表单

    我正在尝试使用 ColdFusion 10 遵循 SagePay 3 00 中加密字段的规范 要求是使用提供的密码作为密钥和初始化向量 在 CBC 模式下使用 PKCS 5 填充将字符串加密为 AES 块大小 128 位 并将结果编码为十六
  • ObjectARX、RealDWG 还是 Teigha? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我计划开发一款读取和操作 dwg 文件中的数据的软件 我决定使用 RealDWG 或 Teigha 而不是编写自己的库来处理数据文件的 读取 但
  • Admob 发送成人内容,如何禁用此功能?

    我刚刚完成了我的第一个应用程序 我正在使用 Admob 来发布广告 但在我上传到谷歌游戏商店之前 我已经在我的设备上进行了测试 一切都很顺利 直到今晚晚些时候 Admob 开始为成人内容做广告 有什么方法可以禁用此功能 如果有人下载我的应用
  • 以 JSON 形式返回实体框架对象

    我尝试在控制器中使用以下方法将实体框架对象作为 Json 返回 public JsonResult EventList var results from s in db Events select new OrderID s EventID
  • Hibernate/Spring 4 升级后,ClassCastException Proxy36 无法转换为 SessionImplementor

    编辑 我不是在问whatClassCastException 是 我想知道在 Spring 4 Hibernate 4 的这个特定配置下 在 DetachedCriteria 中是什么导致了它 我正在尝试将一些遗留代码升级到 Spring