Inyectando JPA's Entity Manager en el EmptyInterceptor de Hibernate
Estoy usando JPA-2.0 con Hibernate en mi capa de acceso a datos.
Para fines de registro de auditoría, estoy usando el EmptyInterceptor de Hibernate configurando la siguiente propiedad en persistence.xml:
<property name="hibernate.ejb.interceptor"
value="com.mycom.audit.AuditLogInterceptor" />
DóndeAuditLogInterceptor se extiende de hibernateorg.hibernate.EmptyInterceptor'.
public class AuditLogInterceptor extends EmptyInterceptor {
private Long userId;
public AuditLogInterceptor() {}
@Override
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) throws CallbackException {
// Need to perform database operations using JPA entity manager
return false;
}
@Override
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) {
// other code here
return false;
}
@Override
public void postFlush(Iterator iterator) throws CallbackException {
System.out.println("I am on postFlush");
// other code here
}
}
Estoy usando el administrador de entidades JPA en la capa de acceso a datos para realizar operaciones de base de datos. La configuración de JPA es como a continuación:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:persistenceUnitName="PersistenceUnit"
p:persistenceXmlLocation="classpath*:persistence.xml"
p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
<property name="loadTimeWeaver">
<bean
class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
</bean>
Mi AbstractDAO es:
public class AbstractDao<T, ID extends Serializable> {
private final transient Class<T> persistentClass;
protected transient EntityManager entityManager;
@SuppressWarnings("unchecked")
public AbstractDao() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@PersistenceContext
public final void setEntityManager(final EntityManager entityMgrToSet) {
this.entityManager = entityMgrToSet;
}
public final Class<T> getPersistentClass() {
return persistentClass;
}
public final void persist(final T entity) {
entityManager.persist(entity);
}
}
Me gustaría inyectar el administrador de entidades JPA en 'AuditLogInterceptor' para poder realizar operaciones de base de datos en 'AuditLogInterceptor' como mi resumen DAO.
¿Alguna idea? ¿Cuál debería ser la solución adecuada?