我需要你的幫助:我使用hibernate envers 4.1.12,我想只啓用刪除監聽器,但我無法做到這一點。 我知道,從hibernate 4開始,不再需要在配置文件中聲明偵聽器,但默認情況下,所有操作都在審計表中觸發,我只需要監視刪除操作。hibernate envers 4:啓用刪除監聽器
你能幫我嗎?
在此先感謝。
我需要你的幫助:我使用hibernate envers 4.1.12,我想只啓用刪除監聽器,但我無法做到這一點。 我知道,從hibernate 4開始,不再需要在配置文件中聲明偵聽器,但默認情況下,所有操作都在審計表中觸發,我只需要監視刪除操作。hibernate envers 4:啓用刪除監聽器
你能幫我嗎?
在此先感謝。
查看手冊中的Conditional audition部分。
什麼,你基本上需要做的是:
Integrator
,其中只使用delete
監聽器(基於中EnversIntegrator
)我告訴你我做了什麼:因爲我使用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());
}
}
}
希望它能幫助。
春季啓動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));
}
}
是的,這是我解決它的方式。我真的不得不說,從我的預期來看,這種方法確實很糟糕。古老的方式遠遠好過。無論如何,謝謝你的幫助。 – Pirulino