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)
在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)
小智 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
| 归档时间: |
|
| 查看次数: |
11414 次 |
| 最近记录: |