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 } }
问题原因解析
服务获取方式错误:
Hibernate 6.x重构了服务分层,bootstrapContext.getServiceRegistry()返回的是BootstrapServiceRegistry,仅包含类加载、日志这类基础服务。而EventListenerRegistry属于SessionFactory级别的服务,必须从SessionFactoryImplementor.getServiceRegistry()(返回SessionFactoryServiceRegistry)中获取。监听器注册参数错误:
你原来的代码传的是PostInsertUpdateEventListener.class,但appendListeners方法需要的是监听器实例,不是类对象。如果传Class,Hibernate无法正确初始化监听器(除非监听器有默认构造函数且Hibernate负责实例化,但手动传入实例更可控)。
其他注意事项
- 你的
HibernateIntegratorProvider和application.yml的配置是正确的,不需要修改。 - 确保
PostInsertUpdateEventListener正确实现了对应的Hibernate事件监听器接口(比如PostCommitInsertEventListener和PostCommitUpdateEventListener)。
内容的提问来源于stack exchange,提问作者gb2
相关产品推荐
相关产品推荐

