繁体   English   中英

休眠:从3.6.9迁移到4.2

[英]Hibernate: migrating from 3.6.9 to 4.2

我正在使用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;
    }
}

如果您对源代码有控制权,我将介绍一下hibernate envers。 它在版本控制方面做得很好。 它不仅像更新的审核路线,而且还能跟踪旧的实体版本。

JPA实体侦听器api的缺点是更改之前无法轻松访问原始值。 您将必须从某处获取这些值以创建增量。

您仍然可以注册休眠事件侦听器,但是现在推荐的方法是使用SPI。 查看Hibernate Integrator,了解其工作方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM