Spring3 集成 Hibernate4,使用Atomikos实现分布式事务控制
注意事项
<!-- 5. 配置事务管理器 注意是,hibernate4,配置成hibernate3报错 -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
配置文件:
<?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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" > <!-- 分布式 事务处理 开始.....--> <!-- PropertyPlaceholderconfigure是一个Bean后处理器,它读取属性文件信息, 并将这些信息设置为Spring配置文件元数据,这里用于读取数据库连接信息 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>dbconn.properties</value> <!-- 这里可列出多个属性文件 --> </list> </property> </bean> <!--1. 配置数据源,使用 Atomikos连接池--> <!--mysql数据源--> <bean id="mysqlDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <description>mysql xa datasource</description> <property name="uniqueResourceName"> <value>mysql_ds</value> </property> <property name="xaDataSourceClassName" value="${dbmysql.driverClassName}" /> <property name="xaProperties"> <props> <prop key="user">${dbmysql.username}</prop> <prop key="password">${dbmysql.password}</prop> <prop key="URL">${dbmysql.url}</prop> </props> </property> <!-- 连接池里面连接的个数 --> <property name="poolSize" value="3"/> </bean> <!--oracle数据源--> <bean id="oracleDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <description>oracle xa datasource</description> <property name="uniqueResourceName"> <value>oracle_ds</value> </property> <property name="xaDataSourceClassName"> <value>${dboracle.driverClassName}</value> </property> <property name="xaProperties"> <props> <prop key="user">${dboracle.username}</prop> <prop key="password">${dboracle.password}</prop> <prop key="URL">${dboracle.url}</prop> </props> </property> <!-- 连接池里面连接的个数 --> <property name="poolSize" value="3"/> </bean> <!-- 2. 配置sessionFactory --> <!-- 2.1 配置mysql 的 sessionFactory --> <bean id="mysqlSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!--dataSource属性指定要用到的连接池--> <property name="dataSource" ref="mysqlDataSource"/> <!--指定要用到的实体映射文件--> <property name="mappingResources"> <list> <value>com/test/hibernate/mapping/News.hbm.xml</value> </list> </property> <!--配置Hibernate的属性--> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect hibernate.hbm2ddl.auto=update hibernate.show_sql=true hibernate.format_sql=true hibernate.temp.use_jdbc_metadata_defaults=false </value> </property> </bean> <!-- 2.2 配置oracle 的 sessionFactory --> <bean id="oracleSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!--dataSource属性指定要用到的连接池--> <property name="dataSource" ref="oracleDataSource"/> <!--指定要用到的实体映射文件--> <property name="mappingResources"> <list> <value>com/test/hibernate/mapping/News.hbm.xml</value> </list> </property> <!--配置Hibernate的属性--> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.OracleDialect hibernate.hbm2ddl.auto=update hibernate.show_sql=true hibernate.format_sql=true hibernate.temp.use_jdbc_metadata_defaults=false </value> </property> </bean> <!--3. 配置atomikos事务管理器 --> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <description>UserTransactionManager</description> <property name="forceShutdown"> <value>true</value> </property> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300" /> </bean> <!--4.配置 spring 的 jta分布式事务管理器 --> <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager"> <ref bean="atomikosTransactionManager" /> </property> <property name="userTransaction"> <ref bean="atomikosUserTransaction" /> </property> </bean> <!--5. 事务配置,主要是使用的transaction-manager不一样 配置增强处理的bean(相当于切面类),也是Spring自动生成普通 业务逻辑bean(targetBean)的代理Bean.里面的tx:method配置每个方法的事务属性, name配置方法名,可使用通配符. --> <tx:advice id="txJpaAdvice" transaction-manager="txManager"> <!-- 配置详细的事务语义 --> <tx:attributes> <!-- 表示get开头的方法是只读的 --> <tx:method name="get*" read-only="true" propagation="REQUIRED"/> <!-- 其他方法使用默认的事务设置 --> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 6. 全局事务切面配置,AOP元素配置 --> <aop:config> <!-- 配置一个切入点 test.hibernate.business包下面所有类的所有方法,都会被加入事务 --> <aop:pointcut id="myJpaPoint" expression="execution(* test.hibernate.business.*.*(..))" /> <!-- 配置 (事务代理)切入点(aop:pointcut) 和 切面类(tx:advice),将二者关联起来 --> <aop:advisor advice-ref="txJpaAdvice" pointcut-ref="myJpaPoint" /> </aop:config> <!--7. 配置两个数据源的Dao,并注入 sessionFactory--> <bean id = "jtaDaoMysqlImp1" class = "test.hibernate.pojo.dao.NewsDao"> <property name="sessionFactory" ref="mysqlSessionFactory"/> </bean> <bean id = "jtaDaoOracleImp1" class = "test.hibernate.pojo.dao.NewsDao"> <property name="sessionFactory" ref="oracleSessionFactory"/> </bean> <!-- 8. 配置business业务逻辑层Bean,需要注入两个Dao层Bean --> <bean id = "newsBusiness" class = "test.hibernate.business.NewsBusiness"> <property name="jtaNewsDaoMysql" ref="jtaDaoMysqlImp1"/> <property name="jtaNewsDaoOracle" ref="jtaDaoOracleImp1"/> </bean> </beans>