Hibernate字节码增强出现NoSuchMethodError问题求助
Hibernate 5.2.4-Final字节码增强后NoSuchMethodError问题解决
问题描述
为Hibernate 5.2.4-Final配置字节码增强,Maven插件配置如下:
<plugin> <groupId>org.hibernate.orm.tooling</groupId> <artifactId>hibernate-enhance-maven-plugin</artifactId> <version>${hibernate.version}</version> <dependencies> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> </dependencies> <executions> <execution> <configuration> <failOnError>true</failOnError> <enableLazyInitialization>true</enableLazyInitialization> <enableDirtyTracking>false</enableDirtyTracking> <enableAssociationManagement>false</enableAssociationManagement> </configuration> <goals> <goal>enhance</goal> </goals> </execution> </executions> </plugin>
此前因构建报错添加了jta依赖,但运行测试时,会随机针对不同类的属性抛出NoSuchMethodError,示例错误栈如下:
Caused by: org.hibernate.PropertyAccessException: Exception occurred inside setter of myPackage.MyClass.listAttribute at org.hibernate.property.access.spi.EnhancedSetterImpl.set(EnhancedSetterImpl.java:86) at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:611) at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:205) at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4619) at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:442) at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:233) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:173) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:863) ... 174 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.hibernate.property.access.spi.EnhancedSetterImpl.set(EnhancedSetterImpl.java:61) ... 182 more Caused by: java.lang.NoSuchMethodError: myPackage.MyClass.$$_hibernate_read_listAttribute()Ljava/util/List; at myPackage.MyClass.$$_hibernate_write_listAttribute(MyClass.java) ... 187 more
解决办法
1. 确保字节码增强覆盖所有实体类
- 在插件配置中明确指定需要增强的实体类路径,避免漏处理:
<configuration> <failOnError>true</failOnError> <enableLazyInitialization>true</enableLazyInitialization> <enableDirtyTracking>false</enableDirtyTracking> <enableAssociationManagement>false</enableAssociationManagement> <!-- 添加实体类路径匹配 --> <includes> <include>myPackage/**/*.class</include> </includes> </configuration>
- 执行
mvn clean compile清理并重新编译,确保增强后的字节码替换原始class文件。
2. 清理依赖冲突
- 确认所有Hibernate相关依赖(
hibernate-core、hibernate-enhance-maven-plugin)版本统一为5.2.4-Final,版本不一致会导致增强逻辑不兼容。 - 移除插件中的jta依赖:Hibernate 5.2.x已内置JTA支持,手动添加的
jta:1.1可能与Hibernate自带依赖冲突,删除后重新构建。
3. 规范实体类访问方式
- 实体类属性需提供标准的getter/setter方法,或使用字段访问模式(添加
@Access(AccessType.FIELD)注解),字节码增强依赖规范的访问逻辑生成代理方法。 - 避免自定义以
$$_hibernate_开头的方法,防止与Hibernate增强方法命名冲突。
4. 确保测试加载增强后的class文件
- 执行
mvn clean test,清理旧编译产物后再运行测试,避免测试阶段加载未增强的原始class文件。 - 检查Maven Surefire插件配置,确认测试类路径指向
target/classes目录,确保使用增强后的字节码。
内容的提问来源于stack exchange,提问作者lasbr
相关产品推荐
相关产品推荐

