2013-03-28 57 views
1

我正在使用spring和hibernate。 Hibernate 4.2声明Ejb3Configuration已过时,并且它没有方法getEventListeners允许设置侦听器。这个班曾经拿到EntityManagerFactory休眠:从3.6.9迁移到4.2

我使用它来进行数据库试听(记录更新,插入,删除事件)。我应该如何获得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

为什么不使用JPA'EntityListener'注解?我相信他们服务于相同的目的。 – 2013-03-28 05:13:42

+0

你能举个例子吗? – Damask 2013-03-28 05:20:20

回答

0

如果你有控制源代码,我会看看hibernate envers。它在版本控制方面做得很好。它不仅仅是一个像更新一样的审计轨迹,而是跟踪旧的实体版本。

JPA实体监听器api的缺点是,在更改之前您无法轻松访问原始值。你将不得不从某处获取这些值来创建增量。

您仍然可以注册您的hibernate事件侦听器,但现在推荐的方法是使用SPI。查看Hibernate Integrator来看看它是如何完成的。