事件监听器不工作的休眠?

问题描述 投票:1回答:2

我已经实现了审计操作的事件监听器在我的实体。例如,我做了一个名为PreInsertEventListener HibernatePreInsert。此外,通过阅读这里的计算器我叫配置的HibernateIntegrator积分。由于我使用Hibernate 4和弹簧4,我创建在名为com.dacasals.raspertwo.interceptors.HibernateInterceptor META-INF /服务文件,并在那里我加积分类,建议在网上和这里。但是,当我运行我的应用程序,并插入一个新的元素,没有任何反应,不显示我的HibernatePrePersist连消息。这是我第一次尝试休眠事件侦听器,我不知道什么可能是错误的。

这里是和示例涉及我的问题类,也文件结构:

监听器:

public class HibernatePreInsert implements PreInsertEventListener{
    private static final long serialVersionUID = 1L;
    static final Logger logger = LoggerFactory.getLogger(HibernatePreInsert.class);

    @Override
    public boolean onPreInsert(PreInsertEvent event) {
        if(event.getEntity() instanceof Person){
            //display a message to know if this works or not
            logger.info("It works");
        }
        return false;
    }
}

积分:

public class HibernateIntegrator implements Integrator{

    public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry){
        final EventListenerRegistry registry = serviceRegistry.getService(EventListenerRegistry.class);

        HibernatePreInsert listener = new HibernatePreInsert();

        registry.prependListeners(EventType.PRE_INSERT, listener);
    }

    @Override
    public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
        // TODO Auto-generated method stub

    }

    @Override
    public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
        // TODO Auto-generated method stub

    }

}

该文件com.dacasals.raspertwo.interceptors.HibernateInterceptor:

com.dacasals.raspertwo.interceptors.HibernateInterceptor

提前致谢。

编辑:我犯了一个错误,而写。我使用休眠5,而不是4。

spring hibernate events listener
2个回答
4
投票

我有我的听众不使用我之前发现的方法来工作。而不是定义与服务的文件,我创建了一个新的类,其中注册我实现事件监听器是这样的:

@Component
public class EscuchadorGeneral {

    @PersistenceUnit
    private EntityManagerFactory emf;

    @Inject
    private InsertEvent insert;

    @Inject
    private UpdateEvent update;

    @Inject
    private DeleteEvent delete;

    @PostConstruct
    protected void init(){
        SessionFactoryImpl sF = emf.unwrap(SessionFactoryImpl.class);
        EventListenerRegistry registry = sF.getServiceRegistry().getService(EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.POST_INSERT).appendListener(insert);
        registry.getEventListenerGroup(EventType.POST_UPDATE).appendListener(update);
        registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener(delete);
    }

}

现在,我可以听的时候我的任何实体的插入,更新或删除。我希望这个解决方案适用于其他开发商了。


2
投票

因为所有你想要做的是操纵关联到该事件的实体,我会在这里提倡@PrePersist的使用。

你可以欺骗Hibernate来仍火JPA集成回调,即使应用程序不使用任何JPA的功能,并继续使用原生SessionFactory配置。

对于之前的5.2休眠,你需要确保你还包括匹配您的hibernate-entitymanager依赖相同版本的上你的依赖的classpath相应版本hibernate-core。为了保存Hibernate 5.2及以后,所有你需要包括是hibernate-core,你显然已经在使用。

接下来是设置META-INF/services/org.hibernate.integrator.spi.Integrator

对于之前的4.2 Hibernate,您需要添加:

org.hibernate.ejb.event.JpaIntegrator

对Hibernate 4.3和5.x,您需要添加:

org.hibernate.jpa.event.spi.JpaIntegrator

您现在应该能够使用@PrePersist回调甚至当你的配置不引导一个JPA EntityManager

然后,当您端口您的应用程序使用JPA具体而言,可以最终消除这种集成配置作为JPA内置EntityManager将自动注册,并执行这些回调。

UPDATE

如果您决定要使用Hibernate EventListener,我会确保这两种方法integrate注册该侦听器。我想你已经实现了其中一人仍然对传统的合同,但我相信以后版本的Hibernate使用其他签名明确,你还没有实现。这可能是为什么你的听众不火。

© www.soinside.com 2019 - 2024. All rights reserved.