TransactionInterceptor.java
package com.ibanfr.infrastructure.dao;
import jakarta.inject.Inject;
import jakarta.interceptor.AroundInvoke;
import jakarta.interceptor.Interceptor;
import jakarta.interceptor.InvocationContext;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
@Transactional
@Interceptor
@Slf4j
public class TransactionInterceptor {
private SessionFactory sessionFactory;
@Inject
public TransactionInterceptor(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@AroundInvoke
public Object doInTransaction(InvocationContext context) throws Exception {
log.debug("*** Intercepted method ***");
Object obj = null;
Session currentSession = null;
try {
currentSession = sessionFactory.getCurrentSession();
currentSession.beginTransaction();
obj = context.proceed();
currentSession.getTransaction().commit();
} catch (Exception e) {
if (currentSession !=null && currentSession.getTransaction().isActive())
currentSession.getTransaction().rollback();
throw new RuntimeException(e);
}
return obj;
}
}