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

