Hibernate 5 does not support the PostgreSQL jsonb
data type by default.
Is there any way to implement jsonb
support for Hibernate + Spring JPA?
If there is a way, what are the pros and cons of using jsonb
with Hibernate?
Hibernate dialectHibernate's PostgreSQL dialect does not support the JSONB datatype, and you need to register it.
The JSONB data type stores JSON (JavaScript Object Notation) data as a binary representation of the JSONB value, which eliminates whitespace, duplicate keys, and key ordering. JSONB supports GIN indexes.
JSONB objects are stored as a decompressed binary as opposed to "raw data" in JSON, where no reparsing of data is required during retrieval. JSONB also supports indexing, which can be a significant advantage.
Thanks Vlad Mihalcea we have such opportunity! )
He created hibernate-types lib:
<dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-52</artifactId> <version>2.1.1</version> </dependency>
which adds a support of 'json', 'jsonb' and other types to Hibernate:
@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; }
More info: 1, 2
@Cepr0-s answer is correct but although I got some issues with it. I was getting exception when trying to use it with PostgreSQL org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
. Way to solve this, in my case, was adding custom hibernate dialect. This resource might be helpful.
// 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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With