2017-07-06 5 views
1

これまで同様の質問がありましたが、実際の解決はありませんでした。java.lang.ClassCastException:org.springframework.orm.hibernate5.SessionHolderはorg.springframework.orm.jpa.EntityManagerHolderにキャストできません

私は、Hibernate WebアプリケーションをJPA対応に変換しています。これまでのDAOクラスは1つしかなく、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) 

変換された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(); 
    } 

図書館:

  • 春-AOP-4.3.2.RELEASE.jar
  • 春豆-4.3.2.RELEASE.jar
  • spring-context-4.3.2.RELEASE.jar
  • 春・コア4.3.2.RELEASE.jar
  • 春-JDBC-4.3.2.RELEASE.jar
  • 春-ウェブ4.3.2.RELEASE.jar
  • 休止・コモンズ、annotations- 5.0.1.Final.jar
  • 休止コア-5.2.1.Final.jar
  • 休止-JPA-2.1-API-1.0.0.Final.jar

これをデバッグするのに役立つ他の何か?私は確認されなかっまし

  • HibernateのSessionとのEntityManager、EntityManagerを使用して1つの方法でのみ1つのDAO の間には混合を、他のすべては アウトをコメント化されています。このテーマに春ブーツ

前の質問使用していない

  • 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

  • 答えて

    0

    は、私たちのapplicationContext.xmlをは、以下のBean定義

    を持っていた

    を解決しました また

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

    に置き換えなければならなかった

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

    は、そこに指定された場所に persistence.xmlのMETA-INF/persistenceを置きます。

    したがって、JpaTransactionManagerHibernateTransactionManagerを置き換え、適切に構成されたBeanを置き換える必要があります。

    関連する問題