sping+hibrnate事务

本文介绍了如何使用Spring和Hibernate进行事务管理,包括配置事务管理器、AOP拦截服务及事务规则,通过具体代码示例说明如何确保事务的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sping+hibrnate事务

web.xml文件中加载配置文件

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
        classpath:spring.xml,
        classpath:spring-hibernate.xml,
        .............
        classpath:spring-tasks.xml
        </param-value>
    </context-param>

spring-hibernate.xml文件一部分

<!-- 配置事务管理器 -->
    <bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

1.拦截服务
aop面向切面

<aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* com.cares.*.service..*Impl.*(..))" />
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
    </aop:config>

2.事务规则
拦截了add*方法的事务:


<!-- 拦截器方式配置事物 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="find*" read-only="true" />
        <tx:method name="get*" propagation="REQUIRED" read-only="true" />
        <tx:method name="add*" propagation="REQUIRED" read-only="false"
            rollback-for="java.lang.RuntimeException" />
        <tx:method name="update*" propagation="REQUIRED" />
        <tx:method name="delete*" propagation="REQUIRED" />
        <tx:method name="save*" propagation="REQUIRED" />
        <tx:method name="test*" propagation="REQUIRED" />
        <tx:method name="*Transaction" propagation="REQUIRED" />
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

3.保证事务一致性

public void addTest() throws DeleteException, DataNotFoundException, CreateException {
        testDAO.delete(testDAO.getById(1));//删除
        Test test = new Test();
        test.setDate(new Date());
        testDAO.add(test);// 新增
}

方法名是add*可以被事务拦截到,而且(运行异常时)抛出异常让事务回滚,【事务的回滚一定得是运行异常】。编译类型异常不能产生回滚。

删除一个序号为1的test,并且新增一个test,但是新增的时候会报错,因为(表中)test还有一个字段的值是不能为空的。
这里写图片描述
test字段是不能为空,只给Date字段赋值,所以新增的时候肯定会产生创建失败异常(CreateException)。

4.实验结果
永远也删除不掉序号为1的test,因为新增产生异常,必然会回滚数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值