【问题标题】:JTA with Spring 4.2 and Hibernate 5.0 (JPA interface)带有 Spring 4.2 和 Hibernate 5.0 的 JTA(JPA 接口)
【发布时间】:2016-05-04 14:27:40
【问题描述】:

最近,我工作的其他开发人员已将我们老化的 Hibernate 依赖项从 3 升级。 (也许是 3.5?)到 5.0。不久之后,他们注意到我们遇到了连接泄漏,由 DBCP 检测到。我的任务是尝试诊断原因。

我也决定尝试升级 Spring,因为这被忽略了,我已经更换了所有相关的 jar 以从 3.0.5 升级到 4.2.5,现在看到了一个我无法想象的不同问题出去。

根据 jar 中的 MANIFEST.MF 文件,我们将 JOTM 用于 JTA,目前使用的是 2.0.11 版本。使用这个版本,结合更新的 Hibernate 和 Spring,我看到了以下内容:

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

在我看来,serviceRegistry()serviceRegistry().getService( ClassLoaderService.class ) 返回 null。 (下面是有问题的方法的内容)

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 );
    }
}

我该如何解决这个问题?我对 Spring 完全陌生,我只能说我们使用的是 JPA (EntityManager) 而不是 Hibernate 的 SessionFactory。

【问题讨论】:

    标签: java spring hibernate jta


    【解决方案1】:

    听起来像是依赖问题。在您的 POM 依赖层次结构中(假设您使用 Maven),检查您的类路径中是否有多个版本的 Hibernate。您可能需要考虑尝试 Hibernate 4.3.11.Final 而不是 5.x

    【讨论】:

    • 很遗憾,这不是问题所在。我们没有使用任何依赖管理系统,如 Ivy 或 Maven,但查看 webapp 的 lib 文件夹仅显示 Hibernate 版本 5。 AFAIK 我们需要版本 5 才能支持 SQL Server 2012。
    猜你喜欢
    • 2015-11-13
    • 2017-03-05
    • 2012-08-31
    • 2011-04-23
    • 2015-06-17
    • 2014-07-18
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多