我有一个使用hibernate envers进行审计的实体。对其中一个字段使用hibernate-type-52库中的“jsonb”类型。例子:
@Entity
@Audited
@Table(name = "entity")
class Entity() {
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
var field1: Map<String, Any> = emptyMap()
}
这是生成的SQL:
create table entity (
field1 jsonb
)
create table entity_aud (
field1 uuid
)
正如你所看到的,jsonb类型没有被用于_aud表中的field d1。当使用psql_enum类型时,会遇到相同的行为。当尝试持久化一个实体时,这当然是一个例外。我如何让envers识别这样的类型并使其相应地生成模式?
最有可能的是,这是因为Hibernate将JDBCType. O其他
映射到PostgresUUIDType
。
正如我在本文中所解释的,您可以创建一个自定义Dialect
来扩展PostgreSQLDialect
:
public class PostgreSQL10JsonDialect
extends PostgreSQL10Dialect {
public PostgreSQL10JsonDialect() {
super();
this.registerHibernateType(
Types.OTHER, JsonNodeBinaryType.class.getName()
);
}
}
如果我们通过hibernate. diect
配置属性提供自定义PostgreSQL10JsonDialect
:
<property
name="hibernate.dialect"
value="com.vladmihalcea.book.hpjp.hibernate.type.json.PostgreSQL10JsonDialect"
/>