玩转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