Hibernate Envers无法识别hibernate-types库PostgreSQLInetType类型如何解决
问题原因
Hibernate Envers默认仅内置支持Hibernate官方提供的标准数据类型,第三方扩展的自定义类型需要手动注册到Envers的类型注册表中才会被识别。
解决方案
步骤1:实现自定义Envers审计类型贡献器
实现AuditContributor接口,将PostgreSQLInetType注册到Envers的支持类型列表中:
import org.hibernate.envers.spi.AuditContributor; import org.hibernate.envers.spi.AuditContribution; import com.vladmihalcea.hibernate.type.basic.PostgreSQLInetType; public class CustomAuditTypeContributor implements AuditContributor { @Override public void contribute(AuditContribution contribution) { contribution.getAuditTypeRegistry().register(PostgreSQLInetType.INSTANCE); } }
如果你使用的是Hibernate 5.x版本,AuditContributor的全类名为
org.hibernate.envers.configuration.spi.AuditContributor,注册逻辑保持一致即可。
步骤2:注册贡献器到Hibernate配置
Spring Boot项目可通过配置文件直接注册,在application.yml中添加如下配置:
spring: jpa: properties: hibernate: envers: audit_contributors: 你自己的包路径.CustomAuditTypeContributor
也可通过SPI服务发现注册:在resources/META-INF/services目录下新建名为org.hibernate.envers.spi.AuditContributor的文件,文件内容填写自定义贡献器的全类名即可。
可选补充配置
如果注册后仍有类型识别问题,可在实体类字段上显式指定类型:
@Entity @Table(name = "my_acl") @TypeDef(typeClass = PostgreSQLInetType.class, defaultForType = Inet.class) @Audited public class MyAcl { @Type(type = "com.vladmihalcea.hibernate.type.basic.PostgreSQLInetType") Inet acl; //其他字段、getter/setter等 }
验证效果
配置完成后重启应用,Envers会正常识别PostgreSQLInetType类型,生成审计表时对应字段也会和业务表保持一致的inet类型,不再抛出类型不支持的异常。
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

