Hibernate 6.3.1 Final报NoClassDefFoundError:缺失EnumValueConverter类
我在使用Hibernate Core 6.3.1 Final和hypersistence-utils-hibernate-62:3.5.3依赖时,遇到了如下NoClassDefFoundError错误:
Caused by: java.lang.NoClassDefFoundError: org/hibernate/type/descriptor/converter/spi/EnumValueConverter at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3373) at java.base/java.lang.Class.getConstructor0(Class.java:3578) at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754) at org.hibernate.internal.util.ReflectHelper.getConstructor(ReflectHelper.java:350) at org.hibernate.boot.model.TypeBeanInstanceProducer.produceBeanInstance(TypeBeanInstanceProducer.java:34) at org.hibernate.boot.model.TypeBeanInstanceProducer.produceBeanInstance(TypeBeanInstanceProducer.java:53) - at org.springframework.orm.hibernate5.SpringBeanContainer.createBean(SpringBeanContainer.java:208) at org.springframework.orm.hibernate5.SpringBeanContainer.getBean(SpringBeanContainer.java:124) at org.hibernate.resource.beans.internal.ManagedBeanRegistryImpl.getBean(ManagedBeanRegistryImpl.java:110) at org.hibernate.mapping.BasicValue.setExplicitCustomType(BasicValue.java:825) at org.hibernate.cfg.annotations.BasicValueBinder.fillSimpleValue(BasicValueBinder.java:1238) at org.hibernate.cfg.SetBasicValueTypeSecondPass.doSecondPass(SetBasicValueTypeSecondPass.java:26)
问题原因
hypersistence-utils-hibernate-62:3.5.3是针对Hibernate 6.2.x版本开发的工具库,而Hibernate 6.3.x对内部API做了调整,org.hibernate.type.descriptor.converter.spi.EnumValueConverter类在6.3版本中已被移除或重构,导致依赖该类的hypersistence-utils无法找到对应类,抛出NoClassDefFoundError。
解决方案
方案一:降级Hibernate版本
将Hibernate Core从6.3.1 Final降级到6.2.x系列版本,确保和hypersistence-utils-hibernate-62:3.5.3的版本完全兼容。方案二:升级hypersistence-utils版本
更换为适配Hibernate 6.3.x的hypersistence-utils依赖,使用hypersistence-utils-hibernate-63前缀的包,选择对应兼容6.3版本的版本号(比如3.6.x及以上版本)。额外排查
检查项目依赖树,确保没有同时引入不同版本的Hibernate Core或hypersistence-utils,避免依赖冲突引发类加载异常。
内容的提问来源于stack exchange,提问作者devendra patidar

