Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to use Hibernate with PostgreSql's JSONB data type?

Tags:

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?

like image 700
Aventes Avatar asked Mar 16 '18 16:03

Aventes


People also ask

Does hibernate support Jsonb?

Hibernate dialectHibernate's PostgreSQL dialect does not support the JSONB datatype, and you need to register it.

What is Jsonb datatype?

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.

How is Jsonb stored?

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.


2 Answers

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

like image 137
Cepr0 Avatar answered Oct 06 '22 04:10

Cepr0


@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" 
like image 27
GROX13 Avatar answered Oct 06 '22 04:10

GROX13