📌  相关文章
📜  org.springframework.orm.jpa.EntityManagerHolder 不能转换为 org.springframework.orm.hibernate5.SessionHolder - Java (1)

📅  最后修改于: 2023-12-03 14:44:57.897000             🧑  作者: Mango

org.springframework.orm.jpa.EntityManagerHolder 不能转换为 org.springframework.orm.hibernate5.SessionHolder - Java

在使用Spring框架中的数据访问对象(DAO)时,可能会遇到以下错误:

org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'transactionManager' defined in class path resource [applicationContext.xml]:
Invocation of init method failed; nested exception is java.lang.ClassCastException:
org.springframework.orm.jpa.EntityManagerHolder cannot be cast to org.springframework.orm.hibernate5.SessionHolder

这个错误的意思是尝试将Spring框架中的 EntityManager 对象转换为Hibernate框架中的 Session 对象时出现了一个类型转换错误。

通常,这会在使用Spring框架的声明式事务管理器时发生,其中Spring尝试将Hibernate SessionEntityManager 提交到底层JDBC事务中。

解决这个错误需要更改你的配置文件。为了解决这个问题,你需要确保在你的Spring配置文件中,使用Hibernate框架的 SessionFactory Bean,而不是使用JPA框架的 EntityManagerFactory Bean。

具体来说,将通过以下步骤进行更改:

  1. 在你的Spring配置文件中找到使用Hibernate Session 的地方。
  2. 确保 SessionFactory Bean 已经被正确定义,并已经被引入到了配置文件中。
  3. 更改 transactionManager Bean 的实例化,使用 Hibernate SessionFactory 来实现,而不是使用 JPA EntityManagerFactory

如果你正在使用Java Config而不是XML文件,更改步骤类似。你将需要创建一个 SessionFactory Bean,并在 transactionManager Bean 中使用它。

更具体地说,你需要做以下步骤:

  1. 转到 @Configuration 类中,并确保已经定义了 sessionFactory Bean。
  2. 创建 HibernateTransactionManager Bean并使用 sessionFactory 将其配置为使用Hibernate Session,而不是JPA EntityManager
  3. 在需要使用事务管理的 Bean 上添加 @Transactional 注释。

在这些更改完成后,再次运行你的应用程序,应该就不再遇到转换错误了。