我正在将应用程序从 Spring Boot 2.7 和 Hibernate 5.6 升级到 Spring Boot 3.0 和 Hibernate 6.2。
应用程序具有实现
org.hibernate.Interceptor
的拦截器,使用 application.yml
和属性 spring.jpa.properties.hibernate.ejb.interceptor
注册,如下所示:
spring:
jpa:
properties:
hibernate:
ejb:
interceptor: org.company.MyInterceptor
问题很简单,执行升级后拦截器停止工作。我还没有在 Hibernate 或 Spring Boot 变更日志或迁移指南中读到这方面的任何更改,所以我想知道为什么这不再起作用。
我还阅读了 Hibernate 官方文档和 Baeldung 上有关拦截器的文章,建议执行以下操作:
SessionFactory sessionFactory = getSessionFactoryBuilder(serviceRegistry)
.applyInterceptor(new CustomInterceptor())
.build();
但是由于一切都是 Spring 管理的,并且我们不直接使用任何这样的代码,我不知道如何将其应用于 Spring 应用程序
只是为了将此问题标记为已回答,正如 Andy Wilkinson 在评论中所说,解决方案是使用此属性:
hibernate.session_factory.interceptor
就我而言,我使用的是旧方法
onPrepareStatement
,我需要提供一个org.hibernate.resource.jdbc.spi.StatementInspector
,使用hibernate.session_factory.statement_inspector