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