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:切换为二进制存储(性能更优)
如果想改用更高效的二进制存储,需要同步修改实体和数据库:
- 修改数据库字段类型:将TPOffers的
id和RTransactions的offerid字段改为BINARY(16) - 修改实体字段类型为
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
相关产品推荐
相关产品推荐

