zoukankan      html  css  js  c++  java
  • 玩转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

  • 相关阅读:
    Eureka的使用
    自定义类加载器
    继承
    Active Objects模式
    Future设计模式
    mysql备份与还原
    多生产者多消费者(第一种方式),基于synchronized,wait,notifyAll
    自己实现阻塞队列(基于数组)
    linux定时任务每隔5分钟向文本追加一行
    自己实现CountDownLatch
  • 原文地址:https://www.cnblogs.com/smallfa/p/14028484.html
Copyright © 2011-2022 走看看