【发布时间】:2018-08-25 19:39:58
【问题描述】:
Hibernate 5 默认不支持 PostgreSQL jsonb 数据类型。
有没有办法实现jsonb 对 Hibernate + Spring JPA 的支持?
如果有办法,在 Hibernate 中使用 jsonb 的优缺点是什么?
【问题讨论】:
-
请不要忘记接受/支持对您有帮助的答案...
-
是的,当然。感谢您的帮助:)
Hibernate 5 默认不支持 PostgreSQL jsonb 数据类型。
有没有办法实现jsonb 对 Hibernate + Spring JPA 的支持?
如果有办法,在 Hibernate 中使用 jsonb 的优缺点是什么?
【问题讨论】:
感谢Vlad Mihalcea我们有这样的机会! )
他创建了hibernate-typeslib:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.1.1</version>
</dependency>
为 Hibernate 添加了对 'json'、'jsonb' 和其他类型的支持:
@Data
@NoArgsConstructor
@Entity
@Table(name = "parents")
@TypeDefs({
@TypeDef(name = "string-array", typeClass = StringArrayType.class),
@TypeDef(name = "int-array", typeClass = IntArrayType.class),
@TypeDef(name = "json", typeClass = JsonStringType.class),
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
public class Parent implements Serializable {
@Id
@GeneratedValue(strategy = SEQUENCE)
private Integer id;
@Column(length = 32, nullable = false)
private String name;
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private List<Child> children;
@Type(type = "string-array")
@Column(columnDefinition = "text[]")
private String[] phones;
public Parent(String name, List<Child> children, String... phones) {
this.name = name;
this.children = children;
this.phones = phones;
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Child implements Serializable {
private String name;
}
【讨论】:
@Cepr0-s 答案是正确的,但我遇到了一些问题。尝试将其与 PostgreSQL org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 一起使用时遇到异常。就我而言,解决此问题的方法是添加自定义休眠方言。 This 资源可能会有所帮助。
// CustomPostgreSQLDialect.java
public class CustomPostgreSQLDialect extends PostgreSQL10Dialect {
public CustomPostgreSQLDialect() {
super();
registerHibernateType(Types.OTHER, StringArrayType.class.getName());
registerHibernateType(Types.OTHER, IntArrayType.class.getName());
registerHibernateType(Types.OTHER, JsonStringType.class.getName());
registerHibernateType(Types.OTHER, JsonBinaryType.class.getName());
registerHibernateType(Types.OTHER, JsonNodeBinaryType.class.getName());
registerHibernateType(Types.OTHER, JsonNodeStringType.class.getName());
}
}
-
# application.yml
spring:
jpa:
properties:
hibernate:
dialect: "com.test.CustomPostgreSQLDialect"
【讨论】: