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

Spring Boot+GraalVM原生镜像使用@CreationTimestamp触发NoSuchMethodException问题

解决Spring Boot + Hibernate时间戳注解在GraalVM原生镜像中的初始化异常

问题场景

在Spring Boot应用中使用Hibernate的@CreationTimestamp和@UpdateTimestamp注解时,通过GraalVM编译为原生镜像后运行,会抛出java.lang.NoSuchMethodException: org.hibernate.generator.internal.CurrentTimestampGeneration.<init>()异常,但使用mvn spring-boot:run运行应用完全正常。

原因分析

该异常的核心原因是GraalVM原生镜像的静态分析机制误判了CurrentTimestampGeneration类的无参构造器的使用情况:GraalVM认为这个构造器未被代码直接调用,因此在编译时将其移除,但实际上Hibernate在运行时会通过反射调用该构造器来生成时间戳。

相关问题已在graalvm-reachability-metadata仓库的Issue 323中被记录,Quarkus也已通过PR 32433完成了同类问题的修复,修复方式是为该类补充必要的反射元数据,确保GraalVM保留其无参构造器。

解决方案

1. 手动添加GraalVM反射元数据

在项目的src/main/resources/META-INF/native-image/目录下创建reflect-config.json文件,添加以下配置,强制GraalVM保留CurrentTimestampGeneration类的所有构造器:

[
  {
    "name": "org.hibernate.generator.internal.CurrentTimestampGeneration",
    "allDeclaredConstructors": true
  }
]

2. 升级依赖等待官方修复

关注Spring Boot、Hibernate或graalvm-reachability-metadata的版本更新,一旦官方发布包含该问题修复的版本,直接升级对应依赖即可。

3. 临时替代方案(手动实现时间戳逻辑)

如果暂时无法添加元数据或升级依赖,可以通过JPA的生命周期注解手动实现时间戳生成,绕过Hibernate的自动生成逻辑:

@Entity
public class YourEntity {
    @Column(nullable = false, updatable = false)
    private LocalDateTime createdAt;

    @Column(nullable = false)
    private LocalDateTime updatedAt;

    @PrePersist
    protected void onCreate() {
        createdAt = LocalDateTime.now();
        updatedAt = LocalDateTime.now();
    }

    @PreUpdate
    protected void onUpdate() {
        updatedAt = LocalDateTime.now();
    }

    // 省略getter和setter
}

内容的提问来源于stack exchange,提问作者ThCollignon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:22:41