2013-01-10 22 views
8

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

+0

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

+0

@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 .. –

+0

Bạn đã kiểm tra kết quả/cuộc chiến, nếu nó có tập tin ở đúng chỗ chưa? – adamw

Trả lời

1

Cố gắng đặt tập tin tích hợp thành:

sample.war\WEB-INF\classes\META-INF\services\... 
0

Có lẽ ...

Trong trường hợp của tôi, tôi sử dụng Maven, và tôi đã phải bao gồm trong số pom.xml, dòng sau: <include>**/*.Integrator</include>, vì tệp không được đóng gói trong số .ear.

My pom.xml:

<resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/*.xml</include> 
       <include>**/*.Integrator</include> 
      </includes> 
     </resource> 
     ... 
0

tạo ra một tập tin org.hibernate.integrator.spi.Integrator (chứa tên đủ tiêu chuẩn của nhà tích hợp tùy chỉnh của tôi) trong một thư mục META-INF/dịch vụ/ dưới src/main/resources của dự án maven của tôi đã tạo mã tích hợp tùy chỉnh của tôi được gọi.

Các vấn đề liên quan