Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.ClassCastException:org.springframework.orm.hibernate5.SessionHolder不能强制转换为org.springframework.orm.jpa.EntityManagerHolder_Hibernate_Jpa - Fatal编程技术网

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

java.lang.ClassCastException:org.springframework.orm.hibernate5.SessionHolder不能强制转换为org.springframework.orm.jpa.EntityManagerHolder,hibernate,jpa,Hibernate,Jpa,过去也有类似的问题,但没有真正的解决办法 我正在将Hibernate Web应用程序转换为启用JPA。到目前为止,只有1个DAO类,在转换为JPA之后,它已经给出了以下错误 注意:我们不使用Spring Boot,所以前面的答案不适用于我们的情况 java.lang.ClassCastException: org.springframework.orm.hibernate5.SessionHolder cannot be cast to org.springframework.orm.jpa.E

过去也有类似的问题,但没有真正的解决办法

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

注意:我们不使用Spring Boot,所以前面的答案不适用于我们的情况

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)
java.lang.ClassCastException:org.springframework.orm.hibernate5.SessionHolder不能强制转换为org.springframework.orm.jpa.EntityManagerHolder
位于org.springframework.orm.jpa.EntityManagerFactoryUtils.doGetTransactionalEntityManager(EntityManagerFactoryUtils.java:221)
位于org.springframework.orm.jpa.SharedEntityManagerCreator$SharedentityManagerInvoke.invoke(SharedEntityManagerCreator.java:255)
位于com.sun.proxy.$Proxy42.createQuery(未知源)
www.nih.nci.cbiit.scimgmt.idp.dao.LookupDao.findById(LookupDao.java:52)
在gov.nih.nci.cbiit.scimgmt.idp.dao.LookupDao$$FastClassBySpringCGLIB$$7b0b6cbb.invoke()上
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:651)
请访问gov.nih.nci.cbiit.scimgmt.idp.dao.LookupDao$$EnhancerBySpringCGLIB$$1cd8b9dd.findById()
www.nih.nci.cbiit.scimgmt.idp.service.impl.lookupserviceinpl.findById(lookupserviceinpl.java:21)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
已转换启用JPA的DAO类,只有1个方法:

public class LookupDao {

    private final Logger log = LogManager.getLogger(getClass());

    @PersistenceContext
    private EntityManager entityManager;

    public LookupT findById(long id) throws Exception {

        log.info("Entered: LookupDao.findById(), id = " + id);      

        // Pre-JPA (pre-conversion; note: commented out. No Hibernate Session conflicts)
        // -------
        /*
        log.info("getting lookup id="+id);
        return sessionFactory.getCurrentSession().get(LookupT.class, id);
        */

        // New JPA Approach (converted)
        // ----------------
        CriteriaBuilder crbuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<LookupT> crquery = crbuilder.createQuery(LookupT.class);

        Root<LookupT> root = crquery.from(LookupT.class);
        crquery.where(      
                    (crbuilder.equal(root.get("id"), id))
                ); 

        Query q = entityManager.createQuery(crquery);
        return (LookupT)q.getSingleResult();
    }
公共类LookupDao{
私有最终记录器log=LogManager.getLogger(getClass());
@持久上下文
私人实体管理者实体管理者;
public LookupT findById(长id)引发异常{
log.info(“输入:LookupDao.findById(),id=“+id”);
//JPA前(转换前;注意:已注释掉。无Hibernate会话冲突)
// -------
/*
log.info(“获取查找id=“+id”);
返回sessionFactory.getCurrentSession().get(LookupT.class,id);
*/
//新的JPA方法(已转换)
// ----------------
CriteriaBuilder crbuilder=entityManager.getCriteriaBuilder();
CriteriaQuery crquery=crbuilder.createQuery(LookupT.class);
Root=crquery.from(LookupT.class);
crquery.where(
(crbuilder.equal(root.get(“id”),id))
); 
Query q=entityManager.createQuery(crquery);
返回(LookupT)q.getSingleResult();
}
图书馆:

  • 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
  • hibernate-jpa-2.1-api-1.0.0.Final.jar
还有什么可能有助于调试它的吗

我已经证实:

  • Hibernate会话和EntityManager之间没有混合,只有1个DAO 对于使用EntityManager的1个方法,其他所有内容都会被注释 出去
  • 不使用弹簧靴
关于这一主题的先前问题:


已解决

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

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

必须用

    <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>

另外,将persistence.xml放入此处指定的位置,
META-INF/persistence

因此关键的一点是
JpaTransactionManager
必须替换
hibernatransactionmanager
,并适当地配置bean