java.lang.ClassCastException:org.springframework.orm.hibernate5.SessionHolder无法强制转换为org.springframework.orm.jpa.EntityManagerHolder

时间:2017-07-06 13:58:05

标签: hibernate jpa

过去曾有类似的问题,但没有真正的解决方案。

我正在将Hibernate Web应用程序转换为启用JPA的应用程序。到目前为止只有1个DAO类,并且在转换为JPA后它已经给出了以下错误。

注意:我们没有使用Spring-Boot,所以先前的答案不适用于我们的案例。

data=newdata
indexes = sample(1:nrow(newdata), size=0.8*nrow(newdata))
test = data[indexes,]
train = data[-indexes,]

转换了启用JPA的DAO类,只有一种方法:

java.lang.ClassCastException: org.springframework.orm.hibernate5.SessionHolder cannot be cast to org.springframework.orm.jpa.EntityManagerHolder
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.doGetTransactionalEntityManager(EntityManagerFactoryUtils.java:221)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:255)
    at com.sun.proxy.$Proxy42.createQuery(Unknown Source)
    at gov.nih.nci.cbiit.scimgmt.idp.dao.LookupDao.findById(LookupDao.java:52)
    at gov.nih.nci.cbiit.scimgmt.idp.dao.LookupDao$$FastClassBySpringCGLIB$$7b0b6cbb.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:651)
    at gov.nih.nci.cbiit.scimgmt.idp.dao.LookupDao$$EnhancerBySpringCGLIB$$1cd8b9dd.findById(<generated>)
    at gov.nih.nci.cbiit.scimgmt.idp.service.impl.LookupServiceImpl.findById(LookupServiceImpl.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

库:

  • spring-aop-4.3.2.RELEASE.jar
  • spring-beans-4.3.2.RELEASE.jar
  • spring-context-4.3.2.RELEASE.jar
  • spring-core-4.3.2.RELEASE.jar
  • spring-jdbc-4.3.2.RELEASE.jar
  • spring-web-4.3.2.RELEASE.jar
  • hibernate-commons-annotations-5.0.1.Final.jar
  • hibernate-core-5.2.1.Final.jar
  • 冬眠-JPA-2.1-API-1.0.0.Final.jar

还有什么可能有助于调试这个吗?

我已经确认:

  • Hibernate Session和EntityManager之间没有混合,只有1个DAO 使用EntityManager的1方法,其他一切都被评论 进行。
  • 不使用Spring-Boot

关于此主题的先前问题: Spring 4 + Hibernate 5 = org.springframework.orm.jpa.EntityManagerHolder cannot be cast to org.springframework.orm.hibernate5.SessionHolder

ClassCastException: org.springframework.orm.jpa.EntityManagerHolder cannot be cast to org.springframework.orm.hibernate5.SessionHolder

1 个答案:

答案 0 :(得分:1)

<强>解决

我们的 applicationContext.xml 具有以下bean定义

Tablix1

必须替换为

<bean id="transactionManager"
    class="org.springframework.orm.hibernate5.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory" />

另外,将 persistence.xml 放入其中指定的位置 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceXmlLocation" value="/META-INF/persistence.xml" /> </bean>

所以关键点是META-INF/persistence必须替换JpaTransactionManager,以及适当配置的bean。