zoukankan      html  css  js  c++  java
  • springboot jpa 级联操作及测试问题 (@Transactional与@Test)

     前言:测试springboot版本     :springBootVersion = '2.0.5.RELEASE'

    一 :搬运@Transactional 

    B. 如果加了事务,必须做好开发环境测试(测试环境也尽量触发异常、测试回滚),确保事务生效。
    C. 以下列了事务使用过程的注意事项,请大家留意。
    1. 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。
    2.不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。
    3.使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)
    4.使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。
    5.经过在ICORE-CLAIM中测试,效果如下:
    A.抛出受查异常XXXException,事务会回滚。
    B.抛出运行时异常NullPointerException,事务会回滚。
    C.Quartz中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)
    D.异步任务中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)
    E.在action中加上@Transactional,不会回滚。切记不要在action中加上事务。
    F.在service中加上@Transactional,如果是action直接调该方法,会回滚,如果是间接调,不会回滚。(即上文3提到的)
    G.在service中的private加上@Transactional,事务不会回滚。

    二:搬运@Test

    测试时使用save()方法向数据库插入一条记录,结果发现通过单元测试了,但是并没有向数据库插入一条记录,一看日志,发现Spring-test对事务进行了回滚。 
    为了使测试数据不对数据库造成污染,在使用Spring-test进行的单元测试的时候,默认会对事务进行回滚,即@Rollback 默认是true,如果想要测试数据不回滚,可设置@Rollback(value = false) 。如果是使用MySQL数据库,在设置了自动回滚之后,如果发现事务依然没有回滚,那么可以查看一下数据库引擎是否是Innodb,因为其他的数据库引擎如MyISAMMemory 都不支持事务。

       实际测试中,@Test @Transactional两个注释一起,对save方法不起作用呀。。。。。mysql数据库引擎是Innodb。

            hibernate的sql语句上有  这句:Rolled back transaction for test ,但是save不回滚。。。delete的方法有回滚效果。。。。

    回滚对save无效举例:

      @Test
        @Transactional
        public void test1() {
            Author author = new Author();
            author.setName("author1");
            Article article = new Article();
            article.setTitle("title");
            article.setContent("内容");
            article.setAuthor(author);
            Article article1 = new Article();
            article1.setTitle("title1");
            article1.setContent("内容1");
            article1.setAuthor(author);
            List<Article> list = new LinkedList<>();
            list.add(article);
            list.add(article1);
            author.setArticleList(list);
            authorDao.save(author);
            Author author1 = authorDao.findAll().get(0);
            List<Article> articleList = author1.getArticleList();
            for (Article lists : articleList) {
                System.out.println(lists.toString());
            }
        }

      结果如下:可以从数据库中查出数据。

     三 级联操作

              https://blog.csdn.net/fly910905/article/details/79465859

  • 相关阅读:
    @SuppressWarnings("resource")
    连续根据两个字段排序
    java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
    java中数组的定义
    单表(多表需手动创建多个转换)插入,更新数据
    批量处理sql
    查询排序后前5名的信息
    面向对象详细
    Flask-SQLAlchemy
    Dbutils-数据库连接池
  • 原文地址:https://www.cnblogs.com/Demonfeatuing/p/9719184.html
Copyright © 2011-2022 走看看