我有一个实体,它使用hibernate环境进行审计。使用";jsonb";从hibernate-types-52库中为其中一个字段键入。示例:
@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表中的field1。使用psql_enum类型时出现相同行为。当试图持久化一个实体时,这当然是一个例外。如何使enver识别这样的类型并相应地生成模式?
这很可能是因为Hibernate将JDBCTypes.OTHER
映射到PostgresUUIDType
。
正如我在本文中所解释的,您可以创建一个自定义Dialect
来扩展PostgreSQLDialect
:
public class PostgreSQL10JsonDialect
extends PostgreSQL10Dialect {
public PostgreSQL10JsonDialect() {
super();
this.registerHibernateType(
Types.OTHER, JsonNodeBinaryType.class.getName()
);
}
}
如果我们通过hibernate.dialect
配置属性提供自定义PostgreSQL10JsonDialect
:
<property
name="hibernate.dialect"
value="com.vladmihalcea.book.hpjp.hibernate.type.json.PostgreSQL10JsonDialect"
/>