You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate 6.6.1集成EventListenerRegistry报UnknownServiceException求助

解决Hibernate 6.6中UnknownServiceException: EventListenerRegistry的问题

你的问题出在Hibernate 6.x的服务注册体系变化,以及监听器注册的一个小错误上,以下是修正方案:

修正EventListenerIntegrator代码

直接从SessionFactoryImplementor获取EventListenerRegistry,并且传入监听器实例而非Class:

public class EventListenerIntegrator implements Integrator {

    @Override
    public void integrate(Metadata metadata, BootstrapContext bootstrapContext, SessionFactoryImplementor sessionFactory) {
        // 从SessionFactory的服务注册表获取EventListenerRegistry
        final EventListenerRegistry eventListenerRegistry = sessionFactory.getServiceRegistry()
                .getService(EventListenerRegistry.class);
        // 传入监听器实例,而非Class
        eventListenerRegistry.appendListeners(EventType.POST_COMMIT_INSERT, new PostInsertUpdateEventListener());
        eventListenerRegistry.appendListeners(EventType.POST_COMMIT_UPDATE, new PostInsertUpdateEventListener());
    }

    @Override
    public void disintegrate(final SessionFactoryImplementor sessionFactory, final SessionFactoryServiceRegistry serviceRegistry) {
        // empty
    }
}

问题原因解析

  1. 服务获取方式错误:
    Hibernate 6.x重构了服务分层,bootstrapContext.getServiceRegistry()返回的是BootstrapServiceRegistry,仅包含类加载、日志这类基础服务。而EventListenerRegistry属于SessionFactory级别的服务,必须从SessionFactoryImplementor.getServiceRegistry()(返回SessionFactoryServiceRegistry)中获取。

  2. 监听器注册参数错误:
    你原来的代码传的是PostInsertUpdateEventListener.class,但appendListeners方法需要的是监听器实例,不是类对象。如果传Class,Hibernate无法正确初始化监听器(除非监听器有默认构造函数且Hibernate负责实例化,但手动传入实例更可控)。

其他注意事项

  • 你的HibernateIntegratorProvider和application.yml的配置是正确的,不需要修改。
  • 确保PostInsertUpdateEventListener正确实现了对应的Hibernate事件监听器接口(比如PostCommitInsertEventListener和PostCommitUpdateEventListener)。

内容的提问来源于stack exchange,提问作者gb2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:38:20