spring在提交侦听器之前休眠

g6ll5ycj  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(228)

我正在寻找一种在每个hibernate事务结束之前执行存储过程的方法。
我认为@postpersit注解在这里没有帮助,因为它绑定到一个实体而不是整个事务。
我可以在每个@transactional方法的末尾添加一个方法调用,但是这个解决方案并不令人满意。
有什么想法吗?谢谢您!

pokxtpni

pokxtpni1#

根据你想要什么,我知道你有两个选择。
如果要在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中的等效值。否则,将在之后而不是之前调用存储过程。

相关问题