私は、データアクセスレイヤーでJPA-2.0をHibernateとともに使用しています。監査ログの目的のためにJPAのエンティティマネージャをHibernateのEmptyInterceptorに挿入
は、私がpersistence.xmlでプロパティの下に設定することで、HibernateのEmptyInterceptorを使用しています:AuditLogInterceptorが休止状態の 'org.hibernate.EmptyInterceptor' 拡張
<property name="hibernate.ejb.interceptor"
value="com.mycom.audit.AuditLogInterceptor" />
。
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
}
}
私はデータベースアクセスを実行するためにデータアクセス層でJPAエンティティマネージャを使用しています。 JPAの構成は以下のようなものです:
<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>
マイ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);
}
}
私は私のような「AuditLogInterceptor」にデータベース操作を実行できるように、「AuditLogInterceptor」内のJPAエンティティマネージャを注入したいと思います抽象的なDAO。
適切な解決策は何でしょうか?
スレッドの安全性はどうですか? –
私はJPA2でauditLogRepositoryへの参照を取得しようとしていますが、@ Resourceアノテーションを使用して何も注入せずにNPEを残してしまったためです。 – Stephane