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

Spring Boot 3升级后UUID关联查询找不到实体异常问题

Spring Boot 3.x 升级后@UuidGenerator关联查询异常解决方案

问题根源

你遇到的奇怪ID(64333734-3234-6231-2d61-3331612d3434)是UUID存储格式不匹配导致的:

  • 原Spring Boot 1.5.x使用@GeneratedValue+@GenericGenerator+@Type(type="uuid-char"),是将UUID以**36位字符串(CHAR(36))**形式存储在数据库
  • 升级后改用@UuidGenerator,默认会以**二进制(BINARY(16))**形式存储UUID;如果实体字段还是String类型,Hibernate会把二进制UUID直接转成十六进制字符串(而非标准UUID格式),导致查询时用错误的ID匹配,找不到关联实体

具体解决方案

根据你的需求选择以下一种方案:

方案1:保持字符串格式存储(兼容历史数据)

如果不想修改数据库字段类型,在实体的UUID字段(包括关联字段)上添加@JdbcTypeCode(SqlTypes.CHAR),强制以字符串形式存储:

// TPOffers实体
@Id
@UuidGenerator
@JdbcTypeCode(SqlTypes.CHAR)
private String id;

// RTransactions实体的关联字段
@Column(name = "offerid")
@JdbcTypeCode(SqlTypes.CHAR)
private String offerid;

该配置会让@UuidGenerator生成标准36位UUID字符串,和原存储格式完全兼容。

方案2:切换为二进制存储(性能更优)

如果想改用更高效的二进制存储,需要同步修改实体和数据库:

  1. 修改数据库字段类型:将TPOffers的id和RTransactions的offerid字段改为BINARY(16)
  2. 修改实体字段类型为UUID,去掉原@Type注解:
// TPOffers实体
@Id
@UuidGenerator
private UUID id;

// RTransactions实体的关联字段
@Column(name = "offerid")
private UUID offerid;

注意:如果有历史数据,需要先将原CHAR(36)的UUID转换为BINARY(16)格式(可通过SQL脚本批量转换)。

关键验证步骤

  • 直接查询数据库,确认TPOffers的id字段值是标准36位UUID字符串(方案1)或二进制数据(方案2)
  • 检查关联查询时传入的URL参数是否和数据库中存储的ID格式完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:02:41