1. 首先在web.xml里面配置一个context-param节点,允许工程有多个spring配置文件,工程比较多的话可能会分很多模块,那每个模块都用一个 applicationContext-层次名-模块名.xml,例如 applicationContext-service-som.xml、applicationContext-action-som.xml等。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
2. 在hibernate 数据源的配置文件(这里取名为 applicationContext-resource.xml)
<!--一些model配置-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSourceDemo" />
<property name="mappingResources">
<property name="mappingResources">
<list>
<value>com/sshDemo/erp/som/model/SomXXXXX.hbm.xml</value>
<value>com/sshDemo/erp/ivc/model/IvcXXXXX.hbm.xml</value>
<value>com/sshDemo/erp/ivc/model/IvcXXXXXX.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.transaction.auto_close_session">true</prop>
<prop key="show_sql">true</prop>
</props>
</property>
</bean>
<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- doing standard CRUD 配置HibernateTemplate.所有DAO层类的基类-->
<bean id="baseDaoHibernate" class="com.synnex.erp.core.dao.BaseDaoHibernate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--配置 jdbcTemplate-->
<bean id="jdbcWrapper" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSourceDemo" />
</bean>
<!--配置service层的事务处理类的基类-->
<bean id="baseTxService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
3. 配置好数据源后,现在真正配置需要做事务保护的service层的类。假设类的接口类 somXXXXService,配置service层遵循 接口名-实现类的方式。给该类配置一个**TX类(其实还是该类本身,不过是真正做事务处理的实例),DAO配置这里省略。
<bean name="somOFDEService"
class="com.synnex.erp.cg.som.service.impl.SomXXXXServiceImpl">
<property name="kimXXXXDAO" ref="kimXXXXDAO" />
<property name="somXXXXServiceTX" ref="somXXXXServiceTX" />
</bean>
<!--这里的 baseTxService 是上面applicationContext-resource.xml配置过的事务基类-->
<bean id="somXXXXServiceTX" parent="baseTxService"
singleton="false">
<property name="target">
<bean
class="com.synnex.erp.cg.som.service.impl.SomXXXXServiceImpl">
<property name="kimXXXXDAO" ref="kimXXXXDAO" />
</bean>
</property>
<property name="transactionAttributes">
<props>
<!--这里的key就是需要做事务保护的serviceTX里面的方法名-->
<prop key="doBatchInsertTX">PROPAGATION_REQUIRED</prop>
<prop key="doDeleteTX">PROPAGATION_REQUIRED</prop>
<prop key="doUpdateTX">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
4. 配置好了后,somXXXXServiceTX.doBatchInsertTX运行时则受事务保护。
说明:做j2ee轻量级开发一般都会使用 Hibernate+spring来做,那事务保护基本是比做的工作哦,在这里做个小结。