如何使用Atomikos Transaction Essentials和Hibernate> = 4.3

seb*_*enz 10 hibernate jta atomikos

我从Hibernate 4.2切换到Hibernate 4.3,我的项目不再工作了.我得到了一个

HibernateException:无法找到当前的JTA事务

当我做

Session s = sessionFactory.getCurrentSession();
Run Code Online (Sandbox Code Playgroud)

我意识到org.hibernate.transaction.TransactionManagerLookup不再存在.它在Hibernate 4.3中被删除了.我该如何更改当前配置?

<hibernate-configuration>
<session-factory>
    <property name="connection.datasource">testDS</property>

    <property name="current_session_context_class">jta</property>
    <property name="transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</property>
    <property name="transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
    <property name="connection.release_mode">auto</property>
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <property name="hibernate.hbm2ddl.auto">create-drop</property>
    <property name="hibernate.show_sql">true</property>
    <mapping class="test.entities.Person" />
    <mapping class="test.entities.CreditCard" />
    <mapping class="test.entities.ExampleRevEntity" />
</session-factory>
Run Code Online (Sandbox Code Playgroud)

seb*_*enz 7

在Hibernate 4.3中,已删除已弃用的长TransactionManagerLookup.现在,JTA提供程序必须实现org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform.Hibernate中已经提供了JTA Platform的抽象实现,即org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform.使用它,为Atomikos编写JTA平台非常简单:

package test;

import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform;
import com.atomikos.icatch.jta.UserTransactionManager;

public class AtomikosJtaPlatform extends AbstractJtaPlatform {

  private static final long serialVersionUID = 1L;
  private UserTransactionManager utm;

  public AtomikosJtaPlatform() {
    utm = new UserTransactionManager();
  }

  @Override
  protected TransactionManager locateTransactionManager() {
    return utm;
  }

  @Override
  protected UserTransaction locateUserTransaction() {
    return utm;
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,必须将平台实现类的名称添加到hibernate配置中:

<property name="hibernate.transaction.jta.platform">test.AtomikosJtaPlatform</property>
Run Code Online (Sandbox Code Playgroud)

  • 嗨Eric,问题是Hibernate会在启动时创建一个JTA平台的新实例.没有办法将Spring创建的JTA平台及其Spring创建的事务管理器注入Hibernate(AFAIK).您可以做的是在JTA平台中对用户事务和事务管理器的引用进行静态.然后在Hibernate首次使用JTA平台之前在Spring上下文中创建它. (5认同)

小智 6

使用Hibernate JTA Platform和Spring编写并编译此代码

package my.domain.spring.hibernate.jta;

import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;

import org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform;
import org.springframework.transaction.jta.JtaTransactionManager;
import org.springframework.util.Assert;

@SuppressWarnings("serial")
public class SpringJtaPlatformAdapter extends AbstractJtaPlatform {

    private static TransactionManager sTransactionManager;
    private static UserTransaction sUserTransaction;


    @Override
    protected TransactionManager locateTransactionManager() {
        Assert.notNull(sTransactionManager, "TransactionManager has not been setted");
        return sTransactionManager;
    }


    @Override
    protected UserTransaction locateUserTransaction() {
        Assert.notNull(sUserTransaction, "UserTransaction has not been setted");
        return sUserTransaction;
    }


    public void setJtaTransactionManager(JtaTransactionManager jtaTransactionManager) {
        sTransactionManager = jtaTransactionManager.getTransactionManager();
        sUserTransaction = jtaTransactionManager.getUserTransaction();
    }


    public void setTransactionManager(TransactionManager transactionManager) {
        sTransactionManager = transactionManager;
    }


    public void setUserTransaction(UserTransaction userTransaction) {
        sUserTransaction = userTransaction;
    }

}
Run Code Online (Sandbox Code Playgroud)

加入你的弹簧配置

  <bean id="txObjcoreManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager">
            <bean class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
                <property name="forceShutdown" value="true" />
            </bean>
        </property>
        <property name="userTransaction">
            <bean class="com.atomikos.icatch.jta.UserTransactionImp">
                <property name="transactionTimeout" value="300" />
            </bean>
        </property>
    </bean>

    <bean id="springJtaPlatformAdapter" class="my.domain.spring.hibernate.jta.SpringJtaPlatformAdapter">
        <property name="jtaTransactionManager" ref="txObjcoreManager" />
    </bean>
Run Code Online (Sandbox Code Playgroud)

不要忘记添加依赖项

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        depends-on="springJtaPlatformAdapter">
Run Code Online (Sandbox Code Playgroud)

最后改变像这样的hibernate配置 hibernate.transaction.jta.platform=my.domain.spring.hibernate.jta.SpringJtaPlatformAdapter