package fr.openwide.core.jpa.hibernate.ejb; import java.util.Map; import org.hibernate.Interceptor; import org.hibernate.boot.SessionFactoryBuilder; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl; import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; import org.jboss.logging.Logger; import org.springframework.beans.factory.annotation.Autowired; /** * Inject an Hibernate Interceptor managed by Spring in the SessionFactory. * * The original idea came from the following blog: * http://blog.krecan.net/2009/01 * /24/spring-managed-hibernate-interceptor-in-jpa/ * but has been completely overhauled with the ORM 4.3 upgrade. */ public class InterceptorAwareHibernatePersistenceProvider extends HibernatePersistenceProvider { private static final Logger LOGGER = Logger.getLogger(InterceptorAwareHibernatePersistenceProvider.class); @Autowired private Interceptor interceptor; @Override @SuppressWarnings("rawtypes") public EntityManagerFactoryBuilder getEntityManagerFactoryBuilder( PersistenceUnitDescriptor persistenceUnitDescriptor, Map integration, ClassLoader providedClassLoader) { return new EntityManagerFactoryBuilderImpl(persistenceUnitDescriptor, integration, providedClassLoader) { @Override protected void populate(SessionFactoryBuilder sfBuilder, StandardServiceRegistry ssr) { super.populate(sfBuilder, ssr); if (InterceptorAwareHibernatePersistenceProvider.this.interceptor != null) { LOGGER.warn("Installing our Spring managed interceptor."); sfBuilder.applyInterceptor(InterceptorAwareHibernatePersistenceProvider.this.interceptor); } } }; } }