You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:45:12