如何使用jakarta.persistence.EntityManager创建Hibernate Search搜索会话?
嗨,这个问题我之前也踩过坑,根源就是版本兼容性的问题,我给你一步步拆解解决办法:
问题出在哪?
你用的是Spring Boot 3.x,这个版本已经完全切换到Jakarta EE规范(也就是jakarta.persistence.*包),但你当前引入的Hibernate Search 6.1.8.Final还是基于旧的Java EE规范(javax.persistence.*)开发的,所以Search.session()方法只认javax.persistence.EntityManager,自然和你注入的jakarta.persistence.EntityManager类型不匹配啦。
核心解决方案:升级Hibernate Search版本
从Hibernate Search 6.2.x版本开始,官方已经完成了向Jakarta EE的迁移,完全支持jakarta.persistence.EntityManager。你只需要修改Gradle依赖里的版本号就行:
把你Gradle中的这两行依赖:
implementation 'org.hibernate.search:hibernate-search-mapper-orm:6.1.8.Final' implementation 'org.hibernate.search:hibernate-search-backend-lucene:6.1.8.Final'
替换成兼容Jakarta的稳定版本(比如当前最新的6.2.5.Final):
implementation 'org.hibernate.search:hibernate-search-mapper-orm:6.2.5.Final' implementation 'org.hibernate.search:hibernate-search-backend-lucene:6.2.5.Final'
验证效果
升级完成后,你原来的代码完全不用改动:
val session = Search.session(entityManager)
现在Search.session()会直接接受jakarta.persistence.EntityManager,类型匹配的问题就彻底解决了,你的搜索逻辑可以正常跑起来。
额外小提醒
如果因为项目限制暂时没法升级到6.2.x,Spring确实提供了javax到jakarta的桥接包,但这只是临时 workaround,不推荐长期用——毕竟升级到适配Jakarta的版本才是根本解决办法,能避免后续更多兼容性问题。
备注:内容来源于stack exchange,提问作者Jan

