Spring Boot 3升级后Hibernate 6拦截器失效问题求助
嘿,我刚把项目从Spring Boot 2.7 + Hibernate 5.6升级到Spring Boot 3.0 + Hibernate 6.2,遇到了个头疼的问题——原来配置的Hibernate拦截器突然失效了!
先说说我的场景:我有个自定义拦截器实现了org.hibernate.Interceptor,之前在application.yml里是这么配置的:
spring: jpa: properties: hibernate: ejb: interceptor: org.company.MyInterceptor
升级后这个拦截器完全没反应了,我翻遍了Spring Boot和Hibernate的迁移指南、变更日志,都没找到相关的说明。我也看过Hibernate官方文档,知道可以手动通过SessionFactoryBuilder来注册拦截器:
SessionFactory sessionFactory = getSessionFactoryBuilder(serviceRegistry) .applyInterceptor(new CustomInterceptor()) .build();
但我的项目全是Spring托管的,根本没写过这种手动构建SessionFactory的代码,完全不知道怎么把这种方式适配到Spring项目里,有没有大佬能指点一下?
可能的解决方案(针对这个问题的常见修复方式)
1. 检查并修改配置属性名
Hibernate 6对配置属性做了规整,原来的hibernate.ejb.interceptor已经被废弃,换成了新的属性名hibernate.session_factory.interceptor。你可以试试把application.yml里的配置改成:
spring: jpa: properties: hibernate: session_factory: interceptor: org.company.MyInterceptor
这是最直接的修复,因为Spring Boot 3适配Hibernate 6后,可能不再默认识别旧的ejb前缀属性了。
2. 通过Spring Bean方式注册拦截器(更推荐的Spring托管方式)
如果配置属性还是不生效,可以把自定义拦截器做成Spring Bean,然后通过HibernatePropertiesCustomizer或者SessionFactoryCustomizer来注册,完全贴合Spring的托管逻辑:
方式一:使用HibernatePropertiesCustomizer
@Configuration public class HibernateInterceptorConfig { // 把自定义拦截器注册为Spring Bean @Bean public MyInterceptor myInterceptor() { return new MyInterceptor(); } // 自定义Hibernate属性,注入拦截器 @Bean public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(MyInterceptor myInterceptor) { return properties -> properties.put("hibernate.session_factory.interceptor", myInterceptor); } }
方式二:使用SessionFactoryCustomizer
@Configuration public class HibernateInterceptorConfig { @Bean public MyInterceptor myInterceptor() { return new MyInterceptor(); } // 直接操作SessionFactoryBuilder来添加拦截器 @Bean public SessionFactoryCustomizer sessionFactoryCustomizer(MyInterceptor myInterceptor) { return sessionFactoryBuilder -> sessionFactoryBuilder.applyInterceptor(myInterceptor); } }
3. 检查拦截器实现的兼容性
另外,你可以确认下自定义拦截器的org.hibernate.Interceptor实现是否兼容Hibernate 6:Hibernate 6对这个接口的部分方法签名做了调整,比如某些方法的参数、返回值有变化,如果你的拦截器里重写了这些方法,可能会因为签名不匹配导致不生效。如果是这种情况,需要按照Hibernate 6的接口规范修改拦截器代码。
备注:内容来源于stack exchange,提问作者ThreeDots

