Mam wymaganie, w którym chcę kontrolować rekordy tylko w przypadku zmiany pola Status. Przestudiowałem rozdział poświęcony dokumentacji "15.8 Kontrola warunkowa".Kontrola warunkowa enumeratorska
Krok 1: Wyłącz automatyczne rejestrowanie detektorów zdarzeń Envers. Mam następujące:
<prop key="hibernate.listeners.envers.autoRegister">false</prop>
Krok 2: Utwórz podklasy dla odpowiednich odbiorców.
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);
}
}
W podobny sposób, mam
- InsertEnversListener
- UpdateEnversListener
- DeleteEnversListener
- CollectionRecreateEnversListener
- PreCollectionRemoveEnversListener
- PreCollectionUpdateEnversL istener
Krok 3: Stwórz własną implementację 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));
}
}
}
Krok 4: Na integrator być stosowane automatycznie po uruchomieniu hibernacji, trzeba będzie dodać plik META-INF/services/org.hibernate.integrator.spi.Integrator
. Oto treść org.hibernate.integrator.spi.Integrator
pliku
com.hib.sample.listener.CustomEnversIntegrator
Nie jestem pewien, czy jestem brakuje niczego. Używam JBoss AS 7.0 z Hibernate 4.1.8
Co się dzieje obecnie? Czy Twój niestandardowy kod integratora jest w ogóle wywoływany? – adamw
@adamw: Dodałem instrukcje sysout do kodu integratora, ale żadne z nich się nie pojawiają. Wygląda na to, że usługi nie są rozpoznawane przez JBOSS. Stworzyłem projekt przy użyciu Eclipse 4.2 Juno jako projektu Dynamic Web. ** Nie jestem pewien, czy Lokalizacja META-INF jest poprawna **. Każda rada ... –
Czy sprawdziłeś wynikowy słoik/wojnę, czy plik jest w odpowiednim miejscu? – adamw