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

带@Lob字段的@Audited表在Hibernate 6.x中报错的解决方案咨询

问题分析

Hibernate 6 对 Lob 类型的映射逻辑做了调整,Envers 审计模块在处理 byte[] 类型的 @Lob 字段时,默认将其映射为 PostgreSQL 的 bytea 类型,但你的主表和审计表字段均为 oid 类型,导致类型不匹配抛出 PSQLException。

解决方法

方法1:显式指定数据库字段类型

在实体类的 content 字段上,通过 @Column 的 columnDefinition 属性强制指定为 oid 类型,确保 Hibernate 及 Envers 都使用正确的类型映射:

@Entity
@Audited
@Table(name = "up_test")
@Getter @Setter
public class UploadTestEntity extends BaseEntity {
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "up_test_seq")
    @TableGenerator(table = "id_generator", name = "up_test_seq", initialValue = 1, allocationSize = 1)    
    private Integer id; 
    
    @Lob
    @Column(columnDefinition = "oid")
    private byte[] content;
    
}

方法2:指定Hibernate专属类型映射

如果方法1无效,可通过 @Type 注解指定 Hibernate 专门处理 PostgreSQL oid 类型的类,强制审计操作时使用正确的类型处理逻辑:

@Entity
@Audited
@Table(name = "up_test")
@Getter @Setter
public class UploadTestEntity extends BaseEntity {
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "up_test_seq")
    @TableGenerator(table = "id_generator", name = "up_test_seq", initialValue = 1, allocationSize = 1)    
    private Integer id; 
    
    @Lob
    @Type(type = "org.hibernate.type.PostgresOidType")
    private byte[] content;
    
}

额外检查项

  • 确认 Hibernate 方言配置正确,例如使用 org.hibernate.dialect.PostgreSQLDialect 或对应版本的方言(如 PostgreSQL15Dialect),避免方言不兼容引发的类型映射错误。
  • 若审计表为自动生成,修改实体类后可重新生成审计表(或手动同步字段类型),保证主表与审计表字段类型完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:31:32