我们正在使用Spring 4.x,Hibernate 5.x,Spring-Data 1.11,我们目前有一个扩展org.hiberate.EmptyInterceptor
的SQL拦截器,我们基本上在Web开始时手动将其挂起使用HibernateInterceptor.setInterceptor
请求。我们还有通过Spring任务调度程序在后台运行的作业。这些开始他们自己的交易,显然没有附加到他们的拦截器。我现在要做的就是找到一种在所有情况下拦截Spring的@Transactional的方法。
我已经查看了TransactionInterceptor
和@TransactionalEventListener
,到目前为止还没有让它们中的任何一个工作,而且很难弄清楚目前的情况被认为是Spring的最佳实践。
基本上我们试图解决的问题是,如果失败或成功,我们需要知道交易的结束。
那么Spring目前的最佳做法是什么,总是得到前/后提交事件,以便我们可以根据需要做出响应?
修改
意识到@TransactionalEventListener
不会起作用,因为我们没有使用Spring事件,所以这只是对我真正做了什么的误解。
答案 0 :(得分:2)
你能做到的一种方法是创建一个简单的方面,例如:
@Aspect
@Component
public class AfterTransactionalAspect {
@After("@annotation(Transactional)")
public void cleanupAfterTransaction(JoinPoint joinPoint) throws Throwable {
// ... Do cleanup work here
}
另一个好方法(如果你使用的是Spring-destined事件)就是使用@TransactionalEventListener
。
您确定使用ApplicationEventPublisher
发布活动吗?您确定在配置上@EnableTransactionManagement
,@TransactionalEventListener
是公共方法,设置了TransactionTemplate
,在发布事件发生的方法上使用@Transactional
吗?