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

Spring Boot UUID主键实体创建后返回ID与数据库存储不一致问题咨询

问题根因

你碰到的返回ID和数据库存储不一致的问题,是两个代码逻辑叠加导致的:

  • 你在Role实体类中定义id字段时,直接给了默认值UUID.randomUUID(),所以你手动实例化Role对象的时候,就会生成第一个临时UUID,也就是你接口返回的f95bddf6-eb22-49bb-b8e6-5eb819603fa9
  • 因为id字段加了@GeneratedValue注解,Hibernate执行持久化操作时,会忽略你已经手动赋值的ID,用配置的uuid2生成器重新生成一个新的UUID写入数据库,也就是你实际看到的87596692-7ee9-4ecb-a425-3b1372d901f4
  • 而你的业务代码中调用roleRepository.save(role)时,没有接收save方法返回的持久化后的实体对象,你用来封装响应的还是最开始自己new的那个临时Role对象,所以返回的还是最初生成的临时ID。

修复方案

任选一种即可:

方案1:删除ID字段的默认赋值

既然已经配置了@GeneratedValue由Hibernate负责生成主键,就不需要手动给ID默认值,将实体类ID字段定义修改为:

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(name = "id", columnDefinition = "CHAR(36)")
@Type(type = "uuid-char")
var id: UUID? = null

同时修改业务层代码,接收save方法返回的持久化对象来构造响应:

override fun store(roleRequest: RoleRequest): RoleResponse {
    val role = Role().apply {
        name = roleRequest.name
        slug = roleRequest.slug
        permissions = roleRequest.permissions
    }
    // 接收save返回的持久化对象
    val savedRole = roleRepository.save(role)
    return RoleResponse(savedRole)
}

方案2:去掉ID的生成注解,完全手动控制ID生成

如果你需要自己控制UUID的生成逻辑,就删除@GeneratedValue和@GenericGenerator两个注解,这样实例化时生成的UUID就会直接写入数据库,不需要额外修改业务层代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:15:01