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

