【发布时间】:2012-12-24 09:48:49
【问题描述】:
我有一个要求,我只想在状态字段更改时审核记录。我已经按照文档章节教程“15.8。条件审计”。
第 1 步:关闭自动 Envers 事件侦听器注册。我有以下内容:
<prop key="hibernate.listeners.envers.autoRegister">false</prop>
第 2 步:为适当的事件侦听器创建子类。
public class DeleteEnversListener extends EnversPostDeleteEventListenerImpl {
private static final long serialVersionUID = 5906427978349712224L;
private static Log log = LogFactory.getLog(DeleteEnversListener.class);
public DeleteEnversListener(AuditConfiguration enversConfiguration) {
super(enversConfiguration);
}
@Override
public void onPostDelete(PostDeleteEvent event) {
log.info("!!! just logging entity !! "+ event.getEntity());
super.onPostDelete(event);
}
}
类似的,我有
- 插入EnversListener
- UpdateEnversListener
- 删除EnversListener
- CollectionRecreateEnversListener
- PreCollectionRemoveEnversListener
- PreCollectionUpdateEnversListener
第 3 步:创建您自己的 org.hibernate.integrator.spi.Integrator 实现
public class CustomEnversIntegrator extends EnversIntegrator {
private static Log log = LogFactory.getLog(CustomEnversIntegrator.class);
@Override
public void integrate(Configuration configuration,
SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
super.integrate(configuration, sessionFactory, serviceRegistry);
final AuditConfiguration enversConfiguration = AuditConfiguration.getFor( configuration, serviceRegistry.getService( ClassLoaderService.class ) );
EventListenerRegistry listenerRegistry = serviceRegistry.getService( EventListenerRegistry.class );
System.out.println("Registering event listeners");
if (enversConfiguration.getEntCfg().hasAuditedEntities()) {
listenerRegistry.appendListeners(EventType.POST_INSERT, new InsertEnversListener(enversConfiguration));
listenerRegistry.appendListeners(EventType.POST_UPDATE, new UpdateEnversListener(enversConfiguration));
listenerRegistry.appendListeners(EventType.POST_DELETE, new DeleteEnversListener(enversConfiguration ) );
listenerRegistry.appendListeners(EventType.POST_COLLECTION_RECREATE, new CollectionRecreateEnversListener(enversConfiguration ) );
listenerRegistry.appendListeners(EventType.PRE_COLLECTION_REMOVE, new PreCollectionRemoveEnversListener(enversConfiguration ) );
listenerRegistry.appendListeners(EventType.PRE_COLLECTION_UPDATE, new PreCollectionUpdateEnversListener(enversConfiguration ) );
}
}
}
第 4 步:要在 Hibernate 启动时自动使用积分器,您需要添加一个META-INF/services/org.hibernate.integrator.spi.Integrator 文件。这是org.hibernate.integrator.spi.Integrator文件的内容
com.hib.sample.listener.CustomEnversIntegrator
我不确定,如果我遗漏了什么。我正在使用 JBOSS AS 7.0 和 Hibernate 4.1.8
【问题讨论】:
-
目前发生了什么?是否调用了您的自定义集成器代码?
-
@adamw:我已将 sysout 语句添加到集成器代码中,但它们都没有出现。 JBOSS 似乎无法识别服务。我已经使用 Eclipse 4.2 Juno 作为动态 Web 项目创建了项目。 不确定 META-INF 的位置是否正确。任何建议..
-
您是否检查了生成的 jar/war,是否将文件放在正确的位置?
-
@Adamw,抱歉延迟回复,是的 META-INF 位于 G:\jboss-as-web-7.0.2.Final\standalone\deployments\sample.war\META 的 WAR 文件中-INF\服务\
-
而且这些类也直接在战争中,而不是在 .jar 中?
标签: hibernate jboss7.x hibernate-envers