美文网首页Java服务器端编程Java 杂谈技术干货
Hibernate声明性事务异常不抛出的问题

Hibernate声明性事务异常不抛出的问题

作者: 李逍遥2018 | 来源:发表于2019-04-17 20:45 被阅读2次

在ssh架构中,假设一个Controller注入并调用了一个Service,而Service上配置了声明性事务,代码如下:

@Service
@Transactional
public class NodeServiceImpl extends CommonServiceImpl
{
    private static final Logger log = Logger.getLogger(NodeServiceImpl.class);
    
    public void save(WfNodeEntity node)
    {
        node.setId("1");
        try
        {
            this.save(node);
        } catch (Exception e) 
        {
            log.info("错误:这里发生异常了!" + e.getMessage());
            e.printStackTrace();
        }
    }

}

我们故意让this.save(node)代码行发生错误(比如把(WfNodeEntity的@column故意改成一个不存在的字段),那么,会发生异常吗?log.info会记录下日志吗?答案是不会的。

因为我们采用的是hibernate,并且是声明性事务,因此,程序执行this.save(node)语句,只是把node放入了hibernate的缓存区域的一块持久化区域,并不会立即执行insert语句。因此程序不会发生异常,log.info()自然就不会执行。

这个save(WfNodeEntity node)方法完成后,返回到Controller层,事务才会被提交,此时hibernate才会刷新、清理缓存,开始执行insert语句,所以此时才会在Controller层抛出异常,并且从控制台是无法看到是save(WfNodeEntity node)方法的哪一行代码发生了异常。

如果想确切的记录this.save(node)这一行发生异常怎么办呢?很简单,在其后追加一行代码即可,即

        try
        {
            this.save(node);
            this.flush();
        } catch (Exception e) 
        {
            log.info("错误:这里发生异常了!" + e.getMessage());
            e.printStackTrace();
        }

这样由于进行了this.flush(),hibernate 会立即执行insert语句,并发生异常,然后被catch住,log.info就能准确记录下错误信息了。

相关文章

  • Hibernate声明性事务异常不抛出的问题

    在ssh架构中,假设一个Controller注入并调用了一个Service,而Service上配置了声明性事务,代...

  • Java---throws关键字声明异常

    throws的作用是声明抛出异常,在方法声明的位置上使用throws关键字向上抛出异常。例如下面程序演示了一般性异...

  • 异常

    1.运行时异常被抛出可以不处理。即不捕获也不声明抛出。【默认throws处理】2.如果父类抛出了多个异常【编译时异...

  • 记一次spring嵌套事务的异常

    异常原因 执行嵌套事务时,由于嵌套的事务方法出错,在上层方法捕获了抛出的异常,spring依旧抛出了一个异常。 异...

  • Java 异常处理——声明、抛出异常

    声明检查类型异常 throws    概述:如果一个方法可能会出现异常,但我们不想使用try..catch 精准...

  • Spring事务

    先说结论:Spring事务异常回滚,捕获异常不抛出就不会回滚。最近遇到了事务不回滚的情况,我还考虑说JPA的事务有...

  • Spring事务失效的8大原因

    一、异常被吃了 把异常吃了,然后又不抛出来,事务不会回滚。 二、异常类型错误 这样事务也是不生效的,因为默认回滚的...

  • SpringBoot事务回滚问题

    SpringBoot事务不回滚问题 Spring声明式事务管理默认对 非检查型异常 或 运行时异常 进行事务回滚,...

  • Java中使用JDK代理时避免UndeclaredThrowab

    当InvocationHandler抛出运行时异常时,异常会被直接抛出。但如果抛出未在接口中声明的受检异常,就会被...

  • flutter【6】dart语言--异常

    异常 和java不同,dart中的异常都是非检查异常,方法可以不声明可能抛出的异常,也不要求捕获任何异常。 dar...

网友评论

    本文标题:Hibernate声明性事务异常不抛出的问题

    本文链接:https://www.haomeiwen.com/subject/wwyowqtx.html