接着上篇
一、准备工作
修改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
