I am using JPA-2.0 with Hibernate in my data access layer.
For audit logging, I use the Hibernate EmptyInterceptor by creating the following property in the persistence.xml file:
<property name="hibernate.ejb.interceptor" value="com.mycom.audit.AuditLogInterceptor" />
Where AuditLogInterceptor extends org.hibernate.EmptyInterceptor hibernation.
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 {
I am using the JPA entity manager at the data access level to perform database operations. JPA configuration is as follows:
<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>
My AbstractDAO:
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); } }
I would like to add a JPA entity manager to the "AuditLogInterceptor" so that I can perform database operations in the "AuditLogInterceptor", like my abstract DAO.
Any idea? What should be the right decision?
source share