Tôi có một yêu cầu mà tôi muốn kiểm toán hồ sơ chỉ khi thay đổi trường Trạng thái. Tôi đã theo hướng dẫn chương tài liệu "15.8. Kiểm tra có điều kiện".Điều kiện Envers Envers Kiểm toán
Bước 1: Tắt đăng ký trình lắng nghe sự kiện Envers tự động. Tôi có:
<prop key="hibernate.listeners.envers.autoRegister">false</prop>
Bước 2: Tạo lớp con cho người nghe sự kiện thích hợp.
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);
}
}
Bằng cách tương tự, tôi có
- InsertEnversListener
- UpdateEnversListener
- DeleteEnversListener
- CollectionRecreateEnversListener
- PreCollectionRemoveEnversListener
- PreCollectionUpdateEnversL istener
Bước 3: Tạo thực hiện của riêng bạn 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));
}
}
}
Bước 4: Đối với các nhà tích hợp được tự động sử dụng khi Hibernate khởi động, bạn sẽ cần phải thêm một tập tin META-INF/services/org.hibernate.integrator.spi.Integrator
. Đây là nội dung của org.hibernate.integrator.spi.Integrator
file
com.hib.sample.listener.CustomEnversIntegrator
Tôi không chắc chắn, nếu tôi thiếu bất cứ điều gì. Tôi đang sử dụng JBoss AS 7.0 với Hibernate 4.1.8
Và điều gì sẽ xảy ra? Mã tích hợp tùy chỉnh của bạn có được gọi là tất cả không? – adamw
@adamw: Tôi đã thêm câu lệnh sysout vào mã trình tích hợp, nhưng không có mã nào trong số đó xuất hiện. Dường như Dịch vụ không được JBOSS công nhận. Tôi đã tạo dự án bằng cách sử dụng Eclipse 4.2 Juno làm dự án Web động. ** Không chắc liệu Vị trí của META-INF có chính xác không **. Mọi lời khuyên .. –
Bạn đã kiểm tra kết quả/cuộc chiến, nếu nó có tập tin ở đúng chỗ chưa? – adamw