Spring配置Hibernate事务的三种方式:
- 使用事务代理工厂生成事务对象
- 使用AOP生成事务
- 使用注解生成事务
方法一:使用事务代理工厂生成事务对象
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:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userServiceImpl" class="www.change.tm.springblank.service.impl.UserServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<!--********************** 下面为事务配置 ********************** -->
<!-- 配置Hibernate事务管理器 -->
<bean id="tx" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 事务的工厂bean -->
<bean id="proxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 指定对哪些接口生成代理 -->
<property name="proxyInterfaces">
<list>
<value>www.change.tm.springblank.service.UserService</value>
</list>
</property>
<!-- 指定事务管理器 -->
<property name="transactionManager" ref="tx"/>
<!-- 指定目标对象 -->
<property name="target" ref="userServiceImpl"/>
<!-- 指定哪些方法开启事务 -->
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
UserServiceImpl服务层:
public class UserServiceImpl implements UserService{
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public UserServiceImpl() {
System.out.println("初始化");
}
@Override
public void save() {
hibernateTemplate.save(new User());
System.out.println("save");
}
}
测试类
public class UserServiceTest {
@Test
public void saveTest(){
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spr*.xml");
//注意 : getBean() 中,获取的id为proxy,事务的代理工厂
UserService userDao =
applicationContext.getBean("proxy", UserService.class);
userDao.save();
applicationContext.close();
}
}
方法二:使用AOP生成事务
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:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userServiceImpl" class="www.change.tm.springblank.service.impl.UserServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<!--********************** 下面为事务配置 ********************** -->
<!-- 配置Hibernate事务管理器 -->
<bean id="tx" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 事务通知 -->
<tx:advice id="txAdvice" transaction-manager="tx">
<tx:attributes>
<!-- 适配所有的save..方法 -->
<tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
<!-- 适配所有的get..方法,同时为只读模式(read-only) -->
<tx:method name="get*" propagation="REQUIRED" isolation="DEFAULT"
read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- aop配置 -->
<aop:config>
<!-- 指定哪些类方法开启事务 -->
<!-- advice-ref : 指定切面通知 -->
<aop:advisor pointcut="execution(* *..*Service.*(..))" advice-ref="txAdvice"/>
</aop:config>
</beans>
UserServiceImpl服务层
public class UserServiceImpl implements UserService{
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public UserServiceImpl() {
System.out.println("初始化");
}
@Override
public void save() {
hibernateTemplate.save(new User());
}
}
测试类
public class UserServiceTest {
@Test
public void saveTest(){
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spr*.xml");
UserService userDao =
applicationContext.getBean("userServiceImpl", UserService.class);
userDao.save();
applicationContext.close();
}
}
方法三:使用注解生成事务
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:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userServiceImpl" class="www.change.tm.springblank.service.impl.UserServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<!--********************** 下面为事务配置 ********************** -->
<!-- 配置Hibernate事务管理器 -->
<bean id="tx" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 注解驱动的事务管理 , 需要指明事务管理器transaction-manager -->
<tx:annotation-driven transaction-manager="tx" />
</beans>
UserServiceImpl服务层
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)
public class UserServiceImpl implements UserService{
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public UserServiceImpl() {
System.out.println("初始化");
}
@Override
@Transactional(readOnly = false)
public void save() {
hibernateTemplate.save(new User());
}
}
测试类
public class UserServiceTest {
@Test
public void saveTest(){
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spr*.xml");
UserService userDao =
applicationContext.getBean("userServiceImpl", UserService.class);
userDao.save();
applicationContext.close();
}
}
本文介绍了Spring配置Hibernate事务的三种方法:通过事务代理工厂、利用AOP和使用注解。详细讲述了每种方法的XML配置,服务层实现以及测试类的编写。
134

被折叠的 条评论
为什么被折叠?



