【问题标题】:Spring Hibernate before Commit Listener提交侦听器之前的 Spring Hibernate
【发布时间】:2021-01-20 10:23:09
【问题描述】:

我正在寻找一种在每个休眠事务结束之前执行存储过程的方法。

我认为 @PostPersit 注释在这里没有帮助,因为它绑定到一个实体而不是整个事务。

我可以在每个 @Transactional 方法的末尾添加一个方法调用,但这个解决方案并不是真的 满意。

有什么想法吗?谢谢!

【问题讨论】:

    标签: java spring hibernate jpa transactions


    【解决方案1】:

    根据您的需要,我知道您有两种选择。

    如果您想在 Hibernate 提交的每个事务之前执行一个操作,您可以使用 Interceptor (javadoc)。

    public class BeforeTransactionCompletionInterceptor extends EmptyInterceptor {
    
        @Override
        public void beforeTransactionCompletion(Transaction tx) {
            // do something before commit
        }
    
    }
    

    这样,代码在 Hibernate 级别的每次提交之前运行。这意味着即使不是通过 Spring 管理的事务也会调用您的存储过程。

    另一方面,如果您想在 Spring 管理的每次提交和 @Transactional 注解之前调用您的存储过程,您可以尝试使用 Spring AOP。

    @Aspect
    @Component
    public class CallStoredProcedureBeforeCommitAspect implements Ordered {
    
        @Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
        public void transactionnalMethod() {}
    
        @After("transactionnalMethod()")
        public void callStoredProcedureAfter(JoinPoint joinPoint) {
            // do something after
        }
    
        @Override
        public int getOrder() {
            return a_higher_priority;
        }
    }
    

    使用 AOP,不要忘记通过设置 @EnableTransactionManagement(order = a_lower_priority) 或 XML 中的等效项来更改通知的默认执行顺序。否则,存储过程将在之后调用,而不是之前。

    【讨论】:

    • 非常感谢拦截器解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 2017-08-13
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多