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

Spring Boot3升级后Hibernate6.1读取PostgreSQL UUID异常排查

问题:Spring Boot3+Hibernate6下PostgreSQL UUID列读取异常

问题背景

将Spring Boot从2.x升级到3.x,同时Hibernate从5.x升级到6.1版本后,PostgreSQL数据库中UUID列的读取结果出现异常。

表结构

Table "public.combination"
           Column           |   Type    | Collation | Nullable |      Default      
----------------------------+-----------+-----------+----------+-------------------
 id                         | uuid      |           | not null | gen_random_uuid()
 kind                       | kind_type |           | not null | 

JPA实体类

import java.util.UUID;

@Entity
@Table(name = "combination")
public class Combination
{
    @Id
    @Column(name = "id")
    @NotNull
    private UUID id;

    public UUID getId()
    {
        return id;
    }
    // 其他字段与方法省略
}

现有表记录

argas=# select * from combination ;
                  id                  |    kind     
--------------------------------------+---------------
 0f787085-9a45-4512-ae55-f6db24ab8178 | connectivity
(1 rows)

Repository查询代码

@Repository
public interface CombinationRepository extends CrudRepository<Combination, UUID>
{
    Iterable<Combination> findAllByKind(@NotNull Kind kind);
}

异常现象

  • Spring Boot2+Hibernate5环境:返回正确UUID 0f787085-9a45-4512-ae55-f6db24ab8178(对应mostSigBits = 1114764626895389970,leastSigBits = -5884525917016194696)
  • Spring Boot3+Hibernate6环境:返回异常UUID 30663738-3730-3835-2d39-6134352d3435(对应mostSigBits = 3487535676028631093)

已尝试方案:

  • 保持运行配置一致,仅切换分支重构
  • 设置hibernate.type.preferred_uuid_jdbc_type为CHAR或BINARY,问题未解决
  • 使用PostgreSQL驱动版本42.5.4

解决步骤

1. 显式指定列类型映射

在实体类的@Column注解中添加columnDefinition,明确匹配PostgreSQL的uuid类型:

@Id
@Column(name = "id", columnDefinition = "uuid")
@NotNull
private UUID id;

2. 配置正确的UUID JDBC类型

在application.properties或application.yml中设置适配PostgreSQL的UUID类型:

hibernate.type.preferred_uuid_jdbc_type=UUID

注:Hibernate 6对类型匹配要求更严格,CHAR/BINARY不适配PostgreSQL原生UUID列,必须指定UUID。

3. 验证驱动兼容性

可尝试将PostgreSQL驱动升级到42.6.0+版本,确保与Hibernate 6的类型处理逻辑完全兼容。

4. 排查自定义类型转换器

检查项目中是否存在旧版UUID自定义转换器,Hibernate 6类型系统改动较大,旧转换器可能导致解析错误,需更新或移除。


原因分析

该问题并非Hibernate Bug,而是版本升级后的类型映射逻辑变化:

  • Hibernate 5会自动适配PostgreSQL的uuid列到JavaUUID类型
  • Hibernate 6增强了类型校验,未明确映射时,会将UUID字符串的ASCII码直接解析为UUID(异常UUID的字符对应原UUID字符串的ASCII值,如30是0的ASCII码),导致解析结果异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:22:47