【发布时间】:2021-01-20 10:23:09
【问题描述】:
我正在寻找一种在每个休眠事务结束之前执行存储过程的方法。
我认为 @PostPersit 注释在这里没有帮助,因为它绑定到一个实体而不是整个事务。
我可以在每个 @Transactional 方法的末尾添加一个方法调用,但这个解决方案并不是真的 满意。
有什么想法吗?谢谢!
【问题讨论】:
标签: java spring hibernate jpa transactions
我正在寻找一种在每个休眠事务结束之前执行存储过程的方法。
我认为 @PostPersit 注释在这里没有帮助,因为它绑定到一个实体而不是整个事务。
我可以在每个 @Transactional 方法的末尾添加一个方法调用,但这个解决方案并不是真的 满意。
有什么想法吗?谢谢!
【问题讨论】:
标签: java spring hibernate jpa transactions
根据您的需要,我知道您有两种选择。
如果您想在 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 中的等效项来更改通知的默认执行顺序。否则,存储过程将在之后调用,而不是之前。
【讨论】: