2014-05-14 101 views
0

我需要你的幫助:我使用hibernate envers 4.1.12,我想只啓用刪除監聽器,但我無法做到這一點。 我知道,從hibernate 4開始,不再需要在配置文件中聲明偵聽器,但默認情況下,所有操作都在審計表中觸發,我只需要監視刪除操作。hibernate envers 4:啓用刪除監聽器

你能幫我嗎?

在此先感謝。

回答

0

查看手冊中的Conditional audition部分。

什麼,你基本上需要做的是:

  • 關閉自動偵聽器註冊
  • 編寫自定義Integrator,其中只使用delete監聽器(基於中EnversIntegrator
  • 設置積分
+0

是的,這是我解決它的方式。我真的不得不說,從我的預期來看,這種方法確實很糟糕。古老的方式遠遠好過。無論如何,謝謝你的幫助。 – Pirulino

0

我告訴你我做了什麼:因爲我使用maven項目結構是衆所周知的[鏈接](http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html)。因此,在src/main/resources中,我創建了一個文件夾META-INF/services /並添加了一個實例化的org.hibernate.integrator.spi.Integrator文件。該文件包含實現EnversIntegrator接口的類的名稱(在我的情況下:eu.dada.prov.sitelock.common.listener.CustomHibernateListenerIntegrator)就是這樣。

類是:

@Component 
public class CustomHibernateListenerIntegrator extends EnversIntegrator { 
@Override 
public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory, 
     SessionFactoryServiceRegistry serviceRegistry) { 

    EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class); 
    listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE); 

    final AuditConfiguration enversConfiguration = AuditConfiguration.getFor(configuration); 

    if (enversConfiguration.getEntCfg().hasAuditedEntities()) { 
     listenerRegistry.appendListeners(EventType.POST_DELETE, new DeleteEnversListener(enversConfiguration)); 
     listenerRegistry.appendListeners(EventType.PRE_UPDATE, new UpdateEnversListener(enversConfiguration)); 
     listenerRegistry.appendListeners(EventType.LOAD, new ProductLoadEventListener()); 
    } 
} 
} 

希望它能幫助。

0

春季啓動1.5.6

我在使用較新的休眠與on cascade delete同樣的問題:envers想插入引用刪除ID,扔違反約束的記錄。

只需添加此答案,以防有人發現它有用。

關閉application.properties中的所有envers偵聽器(如果您有其他等效的測試配置)。

spring.jpa.properties.hibernate.envers.autoRegisterListeners=false 

添加你想要的(這裏我只想插入和更新)。

@Component 
public class HibernateListenerConfigurer 
{ 
    @PersistenceUnit 
    private EntityManagerFactory entityManagerFactory; 

    @PostConstruct 
    protected void init() 
    { 
     SessionFactoryImpl sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl.class); 
     EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class); 
     EnversService enversService = sessionFactory.getServiceRegistry().getService(EnversService.class); 

     registry.getEventListenerGroup(EventType.POST_INSERT).appendListener(new EnversPostInsertEventListenerImpl(enversService)); 
     registry.getEventListenerGroup(EventType.POST_UPDATE).appendListener(new EnversPostUpdateEventListenerImpl(enversService)); 
    } 
}