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
相关产品推荐
相关产品推荐

