Spring 提交监听器前休眠
Spring Hibernate before Commit Listener
我正在寻找一种在每个休眠事务结束之前执行存储过程的方法。
我认为 @PostPersit 注释在这里没有帮助,因为它绑定到一个实体而不是整个交易。
我可以在每个@Transactional 方法的末尾添加一个方法调用,但该解决方案并不是真正的
满意。
有什么想法吗?谢谢!
根据您的需要,我知道您有两种选择。
如果您想在 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 中的等效项来更改通知的默认执行顺序。否则,存储过程将在之后而不是之前调用。
我正在寻找一种在每个休眠事务结束之前执行存储过程的方法。
我认为 @PostPersit 注释在这里没有帮助,因为它绑定到一个实体而不是整个交易。
我可以在每个@Transactional 方法的末尾添加一个方法调用,但该解决方案并不是真正的 满意。
有什么想法吗?谢谢!
根据您的需要,我知道您有两种选择。
如果您想在 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 中的等效项来更改通知的默认执行顺序。否则,存储过程将在之后而不是之前调用。