是否值得使用Hibernate + PostgreSql JSONB?

时间:2018-03-16 16:46:45

标签: hibernate jpa jsonb

我正在研究使用Hibernate 5和PostgreSQL JSONB,但是我遇到了一个Hibernate正确不支持它的问题。

你有任何解决方案,它可能是库,如何实现对Hibernate + Spring JPA的JSONB支持?

此外,您可以通过这种方法看到哪些优点和缺点?

2 个答案:

答案 0 :(得分:16)

谢谢Vlad Mihalcea我们有这样的机会! )

他创建了hibernate-types lib:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>2.1.1</version>
</dependency> 

增加了对json&#39;,&#39; jsonb&#39;的支持。和其他类型的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;
}

更多信息:12

答案 1 :(得分:1)

@Cepr0-的答案是正确的,尽管我对此有一些疑问。尝试在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"