我正在使用spring和hibernate。
Hibernate 4.2将Ejb3Configuration
类声明为已弃用,并且没有方法 getEventListeners ,它允许设置侦听器。此类用于获取EntityManagerFactory
。
我用它来进行数据库试听(记录更新,插入,删除事件)。我如何通过试听配置获取EntityManagerFactory?
public class HibernateExtendedPersistenceProvider extends HibernatePersistence {
private PostInsertEventListener[] postInsertEventListeners;
private PostUpdateEventListener[] postUpdateEventListeners;
private PostDeleteEventListener[] postDeleteEventListeners;
@SuppressWarnings("rawtypes")
@Override
public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
Ejb3Configuration cfg = new Ejb3Configuration();
setupConfiguration(cfg);
Ejb3Configuration configured = cfg.configure( persistenceUnitName, properties );
return configured != null ? configured.buildEntityManagerFactory() : null;
}
@SuppressWarnings("rawtypes")
@Override
public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties) {
Ejb3Configuration cfg = new Ejb3Configuration();
setupConfiguration(cfg);
Ejb3Configuration configured = cfg.configure( info, properties );
return configured != null ? configured.buildEntityManagerFactory() : null;
}
private void setupConfiguration(Ejb3Configuration cfg) {
// 4.2: Ejb3Configuration deprecated and has no method getEventListeners
cfg.getEventListeners().setPostInsertEventListeners(postInsertEventListeners);
cfg.getEventListeners().setPostDeleteEventListeners(postDeleteEventListeners);
cfg.getEventListeners().setPostUpdateEventListeners(postUpdateEventListeners);
}
public void setPostInsertEventListeners(PostInsertEventListener[] postInsertEventListeners) {
this.postInsertEventListeners = postInsertEventListeners;
}
public void setPostUpdateEventListeners(PostUpdateEventListener[] postUpdateEventListeners) {
this.postUpdateEventListeners = postUpdateEventListeners;
}
public void setPostDeleteEventListeners(PostDeleteEventListener[] postDeleteEventListeners) {
this.postDeleteEventListeners = postDeleteEventListeners;
}
}
答案 0 :(得分:0)
如果您对源代码有控制权,我会看看hibernate envers。它在版本控制方面做得很好。它不仅仅是像更新的审计跟踪,而是跟踪旧的实体版本。
JPA实体监听器api的缺点是在更改之前无法轻松访问原始值。您必须从某处获取这些值以创建增量。
您仍然可以注册您的hibernate事件监听器,但现在推荐的方法是使用SPI。查看Hibernate Integrator,看看它是如何完成的。