Spring配置Hibernate事务的三种方式

本文介绍了Spring配置Hibernate事务的三种方法:通过事务代理工厂、利用AOP和使用注解。详细讲述了每种方法的XML配置,服务层实现以及测试类的编写。

Spring配置Hibernate事务的三种方式:

  1. 使用事务代理工厂生成事务对象
  2. 使用AOP生成事务
  3. 使用注解生成事务

方法一:使用事务代理工厂生成事务对象
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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值