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

Spring Boot 3/Hibernate 6 带数据库默认值字段的注解配置问题

解决Hibernate 6中@Generated字段更新失效问题

问题原因

Spring Boot 3升级到Hibernate 6后,@Generated(event = EventType.INSERT)的默认行为发生了变化:Hibernate会将标记该注解的字段默认设置为updatable = false,即更新操作时不会把该字段的新值写入UPDATE语句,导致你手动设置的字段值被忽略,数据库始终保留初始默认值。而Hibernate 5中@Generated(GenerationTime.INSERT)默认允许字段被更新,所以之前的代码可以正常工作。

解决方案

在字段上显式添加@Column(updatable = true),覆盖Hibernate 6的默认配置,同时保留@Generated(event = EventType.INSERT)以同步数据库插入时的默认值。

实体类字段配置示例

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Generated;
import org.hibernate.annotations.EventType;

@Entity
public class YourEntity {
    // 其他字段...

    @Column(name = "colour", nullable = false, updatable = true)
    @Generated(event = EventType.INSERT)
    private String colour;

    @Column(name = "home_office", nullable = false, updatable = true)
    @Generated(event = EventType.INSERT)
    private String homeOffice;

    // Getter、Setter...
}

验证逻辑

  • 插入操作:如果实体字段未设置值,数据库会使用Flyway脚本中定义的默认值,Hibernate会在插入完成后将数据库生成的值同步到实体对象中;如果插入时手动设置了字段值,会直接写入数据库,不会触发默认值。
  • 更新操作:当你修改字段值并调用save()/saveAndFlush()时,Hibernate会检测到字段变化,将新值包含在UPDATE语句中,数据库会更新为新值。

额外注意事项

  • 确保Flyway迁移脚本中字段的DEFAULT配置正确(如VARCHAR(20) NOT NULL DEFAULT 'Blue')。
  • Zonky测试环境需保证迁移脚本正常执行,测试用例中修改字段后需触发Hibernate的脏检查(如调用save()或确保实体处于持久化上下文)。

内容的提问来源于stack exchange,提问作者jonny.l

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:13:12