2016-05-04 7 views
1

Kürzlich haben andere Entwickler, bei denen ich arbeite, unsere älteren Hibernate-Abhängigkeiten von 3 aufgestockt? (vielleicht 3,5?) bis 5,0. Sie bemerkten kurz darauf, dass wir Verbindungslecks bekamen, die von DBCP entdeckt wurden. Ich hatte den Auftrag, die Ursache zu diagnostizieren.JTA mit Spring 4.2 und Hibernate 5.0 (JPA-Schnittstelle)

Ich entschied mich, auch Frühling zu verbessern, da das vernachlässigt wurde, und ich habe alle relevanten Gläser ersetzt, um von 3.0.5 zu 4.2.5 zu verbessern, und sehe jetzt ein anderes Problem, das ich nicht sehen kann herausfinden.

Wir verwenden JOTM für JTA und verwenden derzeit Version 2.0.11, entsprechend der Datei MANIFEST.MF im Jar. Mit dieser Version mit den aktualisierten Hibernate und Spring kombiniert, ich sehe wie folgt zusammen:

org.hibernate.engine.transaction.jta.platform.spi.JtaPlatformException: Could not obtain JOTM transaction manager instance 
     at org.hibernate.engine.transaction.jta.platform.internal.JOTMJtaPlatform.locateTransactionManager(JOTMJtaPlatform.java:31) 
     at org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform.retrieveTransactionManager(AbstractJtaPlatform.java:92) 
     at org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform.getTransactionManager(AbstractJtaPlatform.java:98) 
     at org.hibernate.engine.transaction.jta.platform.internal.TransactionManagerBasedSynchronizationStrategy.canRegisterSynchronization(TransactionManagerBasedSynchronizationStrategy.java:39) 
     at org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform.canRegisterSynchronization(AbstractJtaPlatform.java:131) 
     at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.pulse(JtaTransactionCoordinatorImpl.java:141) 
     at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.<init>(JtaTransactionCoordinatorImpl.java:92) 
     at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl.buildTransactionCoordinator(JtaTransactionCoordinatorBuilderImpl.java:28) 
     at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:274) 
     at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1327) 
     at org.hibernate.jpa.internal.EntityManagerImpl.internalGetSession(EntityManagerImpl.java:133) 
     at org.hibernate.jpa.spi.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:174) 
     at org.hibernate.jpa.internal.EntityManagerImpl.<init>(EntityManagerImpl.java:83) 
     at org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:319) 
     at org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:286) 
     at sun.reflect.GeneratedMethodAccessor399.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:407) 
     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:560) 
     at com.sun.proxy.$Proxy243.createEntityManager(Unknown Source) 
     at org.springframework.orm.jpa.EntityManagerFactoryUtils.doGetTransactionalEntityManager(EntityManagerFactoryUtils.java:285) 
     at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:255) 
     at com.sun.proxy.$Proxy271.createQuery(Unknown Source) 
     at com.company.app.persistence.AbstractEntityGroupDAO.getSomething(AbstractEntityGroupDAO.java:80) 
     at com.company.app.servicehealth.StatusServiceDAO.retrieveStatusServices(StatusServiceDAO.java:259) 
     at com.company.app.servicehealth.StatusServiceDAO.queryForStatusServices(StatusServiceDAO.java:255) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) 
     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:208) 
     at com.sun.proxy.$Proxy273.queryForStatusServices(Unknown Source) 
     at com.company.app.servicehealth.ServiceHealthStatusImpl$1.doInTransaction(ServiceHealthStatusImpl.java:142) 
     ... 50 more 
Caused by: java.lang.NullPointerException 
     at org.hibernate.engine.transaction.jta.platform.internal.JOTMJtaPlatform.locateTransactionManager(JOTMJtaPlatform.java:26) 
     ... 90 more 

Bei näherer Betrachtung sieht das mir entweder als wenn serviceRegistry() oder serviceRegistry().getService(ClassLoaderService.class) zurückkehrt null. (Unten ist der Inhalt der betreffenden Methode)

public static final String TM_CLASS_NAME = "org.objectweb.jotm.Current"; 
public static final String UT_NAME = "java:comp/UserTransaction"; 

@Override 
protected TransactionManager locateTransactionManager() { 
    try { 
     final Class tmClass = serviceRegistry().getService(ClassLoaderService.class).classForName(TM_CLASS_NAME); 
     final Method getTransactionManagerMethod = tmClass.getMethod("getTransactionManager"); 
     return (TransactionManager) getTransactionManagerMethod.invoke(null, (Object[]) null); 
    } 
    catch (Exception e) { 
     throw new JtaPlatformException("Could not obtain JOTM transaction manager instance", e); 
    } 
} 

Wie kann ich das Problem lösen? Ich bin absolut neu in Spring, und alles, was ich sagen kann, ist, dass wir JPA (EntityManager) anstelle von Hibernate SessionFactory verwenden.

Antwort

0

Klingt wie ein Abhängigkeitsproblem. Überprüfen Sie in Ihrer POM-Abhängigkeitshierarchie (vorausgesetzt, Sie verwenden Maven), ob Sie mehrere Versionen von Hibernate in Ihrem Klassenpfad haben. Sie können in Betracht ziehen, Hibernate 4.3.11.Final anstelle von 5.x zu versuchen.

+0

Leider ist dies nicht das Problem. Wir verwenden kein Abhängigkeitsverwaltungssystem wie Ivy oder Maven, aber wenn wir im lib-Ordner nach der Webapp sehen, wird nur Version 5 von Hibernate angezeigt. AFAIK wir brauchen Version 5, um SQL Server 2012 zu unterstützen. – agent154