2015-01-22 13 views
6

I Frühjahr leite 4.1.4, 4.3.8 Hibernate, atomikos 3.9.3, Java 8, tomcat 8.org.hibernate.HibernateException: Nein TransactionManagerLookup auf Hibernate angegeben Upgrade

Ich sehe die oben genannte Ausnahme in localhost .log, wenn ich meinen Server starte, aber ich bin mir nicht sicher, wo ich den TransactionManagerLookup konfigurieren soll, abgesehen von dem, wo ich ihn bereits konfiguriere. Dies geschah nicht vor der Aktualisierung des Ruhezustands, so dass es sich höchstwahrscheinlich um ein Versionierungsproblem handelt. Könnte jemand bitte helfen?

FYI: catalina.out zeigt nichts nützliches. Nur:

SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Error listenerStart 
SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors 

Meine appContext definiert:

<prop key="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory</prop> 
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop> 

und die volle Stack-Trace ist:

22-Jan-2015 10:07:25.734 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class com.my.app.web.InitializerListener 
org.hibernate.HibernateException: No TransactionManagerLookup specified 
    at org.hibernate.context.internal.JTASessionContext.currentSession(JTASessionContext.java:85) 
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014) 
    at com.my.app.dao.AbstractMyDAO.currentSession(AbstractMyDAO.java:116) 
    at com.my.app.dao.AbstractMyDAO.criteria(AbstractMyDAO.java:86) 
    at com.my.app.dao.AbstractMyDAO.count(AbstractMyDAO.java:79) 
    at com.my.app.initialize.MyInitializerImpl.initializeApplicaiton(MyInitializerImpl.java:69) 
    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:483) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy220.initializeApplicaiton(Unknown Source) 
    at com.my.app.web.MyInitializerListener.contextInitialized(MyInitializerListener.java:42) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4772) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714) 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:917) 
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1701) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

EDIT: Der Atomikos Transaktionsmanager als solche

konfiguriert ist
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> 
    <property name="forceShutdown" value="true" /> 
    <!-- in secs --> 
    <property name="transactionTimeout" value="300"/> 
</bean> 
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
    <!-- in secs --> 
    <property name="transactionTimeout" value="300" /> 
</bean> 
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
    <property name="userTransaction" ref="atomikosUserTransaction" /> 
    <property name="transactionSynchronizationName" value="SYNCHRONIZATION_ON_ACTUAL_TRANSACTION" /> 
    <property name="allowCustomIsolationLevels" value="true"/> 
</bean> 

EDIT 2:

Ich denke, ich muss hier ein wenig klären. Ich habe ein DAO-Objekt namens AbstractMyDAO (wie Sie aus dem Stapel sehen können). In diesem Objekt wird eine Sitzung ab Werk definiert

@Autowired 
private SessionFactory mySessionFactory; 

wenn currentSession der obige Fehler genannt wird ausgelöst, weil Hibernate nicht den Transaktions-Manager-Lookup im Zusammenhang mit dieser Sitzung Fabrik finden.

public Session currentSession() { 
    return mySessionFactory.getCurrentSession(); 
} 

Diese Sitzung Fabrik ist in meiner app Kontextdatei als solche definiert:

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

    <property name="dataSource"> 
     <ref bean="myDataSource" /> 
    </property> 
    <property name="annotatedClasses"> 
     <list> 
      <value>some values... </value> 
      ... 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       ${gst.hibernate.dialect} 
      </prop> 
      <prop key="query.factory_class"> 
       org.hibernate.hql.ast.ASTQueryTranslatorFactory 
      </prop> 
      <prop key="hibernate.max_fetch_depth">3</prop> 
      <prop key="hibernate.show_sql">${my.hibernate.showsql}</prop> 
      <prop key="hibernate.cache.use_query_cache">true</prop> 
      <prop key="hibernate.cache.use_second_level_cache">true</prop> 
      <prop key="hibernate.cache.use_structured_entries">true</prop> 
      <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop> 
      <prop key="net.sf.ehcache.configurationResourceName">${ehcache.my.persist.config}</prop> 
      <prop key="hibernate.connection.isolation">3</prop> 
      <prop key="connection.release_mode">auto</prop> 
      <prop key="hibernate.current_session_context_class">jta</prop> 
      <prop key="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory</prop> 
      <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop> 
      <prop key="hibernate.search.default.directory_provider">filesystem</prop> 
      <prop key="hibernate.search.default.indexBase">/var/log/my/lucene/indexes</prop> 
     </props> 
    </property> 
</bean> 

Wie Sie sehen können, kann die Eigenschaft hibernate.transaction.manager_lookup_class definiert wird, aber nicht, wenn die gefunden werden Bean ist erstellt und ich habe keine Ahnung warum. Hat sich die Konfiguration geändert?

EDIT 3: Wenn ich debuggen: final JtaPlatform jtaPlatform = factory() getServiceRegistry() getService (JtaPlatform.class);..

Es gibt eine NoJTAPlatform zurück. Ich denke, das ist mein Problem.

EDIT 4: Es scheint nichts zu sein, das JtaPlatform, die für Kater geeignet ist oder ist ich geistig?

Antwort

1

Die Antwort auf meine Frage ist here.

"In Hibernate 4.3 wurde der lange veraltete TransactionManagerLookup entfernt. Jetzt muss der JTA-Provider org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform implementieren."

1

Stellen Sie sicher, dass auch die Atomikos Transaction Manager konfigurieren, so dass die TransactionManagerLookup die UserTransaction entsprechend finden können:

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" 
    init-method="init" destroy-method="close"> 
    <property name="transactionTimeout" value="300" /> 
</bean> 
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
    <property name="transactionTimeout" value="300" /> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
    <property name="userTransaction" ref="atomikosUserTransaction" /> 
</bean> 

Dann Sie Frühling EntityManager Fabrik verwenden sollte:

<bean id="entityManager" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    p:dataSource-ref="dataSource" 
    p:persistenceXmlLocation="**/persistence.xml" 
    p:persistenceUnitName="persistenceUnit" 
    depends-on="dataSource, transactionManager"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <props>     
      <prop key="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory</prop>      
      <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop> 
      ... 
     </props> 
    </property> 
</bean> 

Dann wird die DAOs sollten den EntityManager eingeben:

@PersistenceContext(unitName = "persistenceUnit") 
private EntityManager entityManager; 

Statt Aufruf currentSession (AbstractMyDAO) direkt:

at com.my.app.dao.AbstractMyDAO.currentSession(AbstractMyDAO.java:116) 
+0

Danke, ich hatte bereits den atomikos transaction manager konfiguriert (siehe edit), aber nicht den Entity Manager. Ich werde es versuchen und berichten :) –

+0

Können Sie mir erklären, warum ich den Entity Manager verwenden müsste? Meine Anwendung hat zuvor ohne diese Komponente funktioniert. Das Problem ist erst nach einem Winterschlaf-Upgrade aufgetreten. Vielen Dank. –

+0

Das liegt daran, dass Hibernate eher eine JPA-Implementierung als ein eigenständiges ORM-Framework ist. Sie können weiterhin die SessionFactory verwenden, aber es ist besser, die Spring 'LocalSessionFactoryBean' zu verwenden, da Sie auch eine automatische Sitzungs- und JDBC-Verbindungsverwaltung erhalten. –