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

Hibernate 6.2.5 Final审计表UUID存储异常问题

Hibernate 5迁移至Hibernate 6时UUID审计表存储异常问题

问题背景

将项目从Hibernate 5迁移到Hibernate 6,原Hibernate 5中使用@Type(type="uuid-char")处理UUID的数据库存储,迁移后替换为@JdbcTypeCode(SqlTypes.VARCHAR),主表的UUID存储正常,但写入审计表时出现字符串值错误。

实体类代码

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.envers.AuditTable;
import org.hibernate.envers.Audited;
import org.hibernate.type.SqlTypes;
import sg.customs.ntp.rsrf.commonservice.base.model.BaseModel;

import java.util.UUID;

@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "tbl_sample", schema = "sample_schema", catalog = "sample_schema")
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler"})
@Audited
@AuditTable(value = "tbl_sample_audit", schema = "sample_schema", catalog = "sample_schema")
public class SampleModel extends BaseModel {
    @Id
    @Column(name = "SampleId")
    @JdbcTypeCode(SqlTypes.VARCHAR)
    private UUID sampleId = UUID.randomUUID();
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "CompanyId")
    private CompanyModel company;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "UserId")
    private UserModel user;

    @Column(name = "Email", length = 300)
    private String email;
}

报错信息

Caused by: java.sql.SQLException: Incorrect string value: '\xE2\x91\xF5V\xA5F...' for column 'SampleId' at row 1
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1009)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1320)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:994)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:275)
    ... 136 more

解决方案

  • 全局配置UUID默认映射类型
    在项目配置文件(如application.properties)中添加以下配置,让Hibernate(包括Envers)默认将UUID映射为VARCHAR类型,无需在每个字段单独标注:

    hibernate.type.preferred_uuid_jdbc_type=VARCHAR
    
  • 兼容使用@Type注解
    保留@Type注解配合@JdbcTypeCode,确保Envers识别类型配置:

    @Id
    @Column(name = "SampleId")
    @Type(value = "uuid-char")
    @JdbcTypeCode(SqlTypes.VARCHAR)
    private UUID sampleId = UUID.randomUUID();
    
  • 检查审计表字段类型
    手动确认审计表tbl_sample_audit的SampleId字段类型为VARCHAR(36)(UUID字符串标准长度),字符集设为UTF-8。若字段类型为BINARY或其他类型,需修改为VARCHAR。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:20:36