Hibernate Search 5.5.2在CentOS7测试出现实体加载断言失败异常求助
先把你遇到的异常信息贴出来方便参考:
org.hibernate.search.exception.AssertionFailure: An entity got loaded even though it was not part of the EntityInfo list at org.hibernate.search.query.hibernate.impl.CriteriaObjectInitializer.initializeObjects(CriteriaObjectInitializer.java:95) at org.hibernate.search.query.hibernate.impl.QueryLoader.executeLoad(QueryLoader.java:88) at org.hibernate.search.query.hibernate.impl.AbstractLoader.load(AbstractLoader.java:58) at org.hibernate.search.query.hibernate.impl.FullTextQueryImpl.list(FullTextQueryImpl.java:201) at org.hibernate.search.jpa.impl.FullTextQueryImpl.getResultList(FullTextQueryImpl.java:153)
这个断言是Hibernate Search在验证查询结果时触发的:当它从索引中拿到一批实体ID去数据库加载时,发现加载出来的实体不在预先构建的EntityInfo列表里,说明索引数据和数据库实体之间出现了不一致,或者加载过程中出了问题。结合CentOS7的环境变化,可能的原因如下:
SELinux权限限制导致索引损坏
CentOS7默认开启了更严格的SELinux策略,而CentOS6的SELinux通常默认配置更宽松。如果Hibernate Search的索引目录(比如你配置的hibernate.search.default.indexBase路径)没有被SELinux授权读写,会导致索引文件写入不完整或者损坏。当查询时,索引返回的实体ID在数据库中存在,但索引对应的EntityInfo元数据缺失,就会触发这个断言。你可以临时执行sudo setenforce 0关闭SELinux测试,或者给索引目录添加适配的SELinux上下文。系统自带依赖库版本冲突
Hibernate Search 5.5.2依赖Lucene 5.5.2版本,CentOS7的系统仓库中可能自带了不同版本的Lucene相关库(比如lucene-core),如果你的应用通过系统路径加载了这些库,而不是使用自身打包的依赖,就会出现版本不兼容。CentOS6自带的Lucene版本通常更低,不会和5.5.2冲突,而CentOS7的版本可能更高,导致索引解析逻辑不一致,生成的EntityInfo列表和实际加载的实体不匹配。建议检查应用的类加载路径,确保优先使用自身打包的Lucene依赖。JVM版本差异导致的类加载/序列化问题
CentOS7默认安装的是OpenJDK 8,而CentOS6通常默认是OpenJDK 7。JDK版本变化可能影响实体类的序列化ID生成、类加载顺序,或者Hibernate内部的反射逻辑。比如,某些实体类在JDK7和JDK8下的元数据(比如字段顺序、注解处理)有细微差异,导致Hibernate Search生成的EntityInfo和实际加载的实体不匹配。你可以尝试在CentOS7上安装和CentOS6相同版本的JDK,测试是否能解决问题。索引文件跨操作系统兼容性问题
如果你直接把CentOS6上生成的索引文件复制到CentOS7使用,可能因为文件系统差异(CentOS6常用ext3/ext4,CentOS7默认xfs)或者字节序问题导致索引文件读取异常。索引中的实体元数据可能损坏,导致查询时返回的实体ID对应的EntityInfo不存在。这种情况下,建议删除旧索引,在CentOS7环境下重新生成索引。数据库驱动或JDBC配置变化
CentOS7默认的数据库驱动包(比如mysql-connector-java)版本可能和CentOS6不同,或者JDBC连接参数(比如useSSL、characterEncoding)的默认值变化,导致Hibernate在加载实体时的SQL执行结果和预期不一致。比如,查询返回的实体数量、ID顺序和索引中的不匹配,进而触发断言失败。检查你的应用是否使用了系统自带的数据库驱动,替换成和CentOS6一致的版本试试。
内容的提问来源于stack exchange,提问作者user3800293

