spring在提交侦听器之前休眠

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

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

pokxtpni

pokxtpni1#

根据你想要什么,我知道你有两个选择。
如果要在hibernate提交的每个事务之前执行操作,可以使用 Interceptor (javadoc)。

  1. public class BeforeTransactionCompletionInterceptor extends EmptyInterceptor {
  2. @Override
  3. public void beforeTransactionCompletion(Transaction tx) {
  4. // do something before commit
  5. }
  6. }

这样,在hibernate级别的每次提交之前都会运行代码。这意味着即使不是通过spring管理的事务也会调用您的存储过程。
另一方面,如果您想在spring和 @Transactional 注解,您可以尝试使用spring aop。

  1. @Aspect
  2. @Component
  3. public class CallStoredProcedureBeforeCommitAspect implements Ordered {
  4. @Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
  5. public void transactionnalMethod() {}
  6. @After("transactionnalMethod()")
  7. public void callStoredProcedureAfter(JoinPoint joinPoint) {
  8. // do something after
  9. }
  10. @Override
  11. public int getOrder() {
  12. return a_higher_priority;
  13. }
  14. }

使用aop时,不要忘记通过设置 @EnableTransactionManagement(order = a_lower_priority) ,或xml中的等效值。否则,将在之后而不是之前调用存储过程。

展开查看全部

相关问题