玩转spring boot——结合JPA事务

接着上篇

一、准备工作


修改pom.xml文件

 pom.xml

添加src/resources/application.properties文件

 application.properties

添加src/resources/templates/index.html文件

 View Code

上篇的Order类

 Order.java

新建实现JpaRepository的OrderRepository接口

 OrderRepository.java

新建OrderDao类

复制代码
package com.github.carter659.spring06;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.mysql.jdbc.StringUtils;

@Repository
public class OrderDao {

    @Autowired
    private OrderRepository orderRepository;

    /**
     * 获取全部
     * 
     * @return
     */
    public List<Order> findAll() {
        return orderRepository.findAll();
    }

    /**
     * 持久化
     * 
     * @param entity
     * @return
     */
    public void save(Order entity) throws Exception {
        // 持久化
        orderRepository.save(entity);
        // 如果持久化成功,就抛出异常。如果开启事务,那么刚才持久化的数据应回滚
        if (!StringUtils.isNullOrEmpty(entity.id))
            throw new Exception("测试无法持久化第一条数据的异常");
    }
}
复制代码

假设:当成功insert一条数据后,抛出异常。如果事务生效,则数据会回滚。反之,则不回滚。

控制器:MainController

 MainController.java

程序入口:App.java

 App.java

运行效果:

添加数据

点击保存按钮,并观察数据是否回滚:

虽然抛出异常,但数据并未回滚。

二、实现事务


这时,我修改OrderDao类,增加@Transactional(readOnly = false, rollbackFor = Throwable.class)注解:

复制代码
package com.github.carter659.spring06;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.mysql.jdbc.StringUtils;

@Repository
@Transactional(readOnly = false, rollbackFor = Throwable.class)
public class OrderDao {

    @Autowired
    private OrderRepository orderRepository;

    /**
     * 获取全部
     * 
     * @return
     */
    public List<Order> findAll() {
        return orderRepository.findAll();
    }

    /**
     * 持久化
     * 
     * @param entity
     * @return
     */
    public void save(Order entity) throws Exception {
        // 持久化
        orderRepository.save(entity);
        // 如果持久化成功,就抛出异常。如果开启事务,那么刚才持久化的数据应回滚
        if (!StringUtils.isNullOrEmpty(entity.id))
            throw new Exception("测试无法持久化第一条数据的异常");
    }
}
复制代码

继续添加数据:

按钮保存按钮,发现:数据回滚

代码下载:https://github.com/carter659/spring-boot-06.git

原文地址:https://www.cnblogs.com/smallfa/p/14028484.html