Spring + JPA + atomikos实现Oracle + SQL Server

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

	<persistence-unit name="orcaleXA" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.Oracle10gDialect" />
			<property name="hibernate.connection.driver_class"
				value="oracle.jdbc.xa.client.OracleXADataSource" />
			<property name="hibernate.connection.url"
				value="jdbc:oracle:thin:name/[email protected]:1521:XE" />
			<property name="hibernate.show_sql" value="true" />
			<!-- property name="hibernate.transaction.factory_class" 
				value="com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory" /-->
			<property name="hibernate.transaction.manager_lookup_class"
				value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
		</properties>
	</persistence-unit>


	<persistence-unit name="sqlServerXA" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.SQLServerDialect" />
			<property name="hibernate.transaction.manager_lookup_class"
				value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
			<property name="hibernate.show_sql" value="true" />
		</properties>
	</persistence-unit>
</persistence>
atomikos文档上说不用设置hibernate.transaction.factory_class,另外发现在WAS配置Hibernate JPA也应该不要设置hibernate.transaction.factory_class。

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

	<context:component-scan base-package="xx.yy.mypackage" />
	<context:annotation-config />

	<bean id="dataSource"
		class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
		<property name="uniqueResourceName">
			<value>XADBMS</value>
		</property>
		<property name="xaDataSourceClassName">
			<value>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</value>
		</property>
		<property name="xaProperties">
			<props>
				<prop key="user">sa</prop>
				<prop key="password">Passw0rd</prop>
				<prop key="serverName">192.168.201.214</prop>
				<prop key="databaseName">myDataBase</prop>
			</props>
		</property>
		<property name="poolSize">
			<value>1</value>
		</property>
	</bean>

	<bean id="orcaleXAEntityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceXmlLocation"
			value="/META-INF/persistence.xml" />
		<property name="persistenceUnitName" value="orcaleXA" />
	</bean>

	<bean id="sqlServerXAEntityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceXmlLocation"
			value="/META-INF/persistence.xml" />
		<property name="persistenceUnitName" value="sqlServerXA" />
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- bean id="transactionManager"
	class="org.springframework.orm.jpa.JpaTransactionManager">
	<property name="entityManagerFactory" ref="emf" />
	</bean-->

	<bean id="AtomikosTransactionManager"
		class="com.atomikos.icatch.jta.UserTransactionManager"
		init-method="init" destroy-method="close">
		<property name="forceShutdown" value="false" />
	</bean>

	<bean id="AtomikosUserTransaction"
		class="com.atomikos.icatch.jta.UserTransactionImp">
		<property name="transactionTimeout" value="300" />
	</bean>

	<bean id="transactionManager"
		class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="transactionManager"
			ref="AtomikosTransactionManager" />
		<property name="userTransaction" ref="AtomikosUserTransaction" />
	</bean>

	<tx:annotation-driven transaction-manager="transactionManager" />

	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="find" read-only="true" />
			<tx:method name="check" read-only="true" />
			<tx:method name="*" read-only="false" />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<aop:pointcut id="txPointcut"
			expression="execution(public * xx.yy.mypacke..*Service.*(..))" />
		<aop:advisor advice-ref="txAdvice"
			pointcut-ref="txPointcut" />
	</aop:config>
</beans> 

@Service
public class XxService {
	@PersistenceContext(unitName = "orcaleXA")
	private EntityManager oracleXaEm;

	@PersistenceContext(unitName = "sqlServerXA")
	private EntityManager sqlServerXaEm;
	public void run(){
		oracleXaEm.createQuery("...");
		sqlServerXaEm.createQuery("...");
	}
}

@ContextConfiguration(locations = "/applicationContext.xml")
public class TestXA extends AbstractJUnit38SpringContextTests {
	@Autowired
	private XxService xxService;

	public void testRun() {
		System.out.println("<<");
		myService.go();
	}
}

lib:

atomikos-util.jar

transactions-jta.jar

transactions-api.jar

transactions.jar

transactions-hibernate3.jar

transactions-jdbc.jar


你可能感兴趣的:(Spring + JPA + atomikos实现Oracle + SQL Server)