jpa Hibernate可以和PostgreSQL的JSONB数据类型一起使用吗?

nkhmeac6  于 2023-05-18  发布在  PostgreSQL
关注(0)|答案(3)|浏览(203)

Hibernate 5默认不支持PostgreSQL jsonb数据类型。
有没有办法实现jsonb对Hibernate + Spring JPA的支持?
如果有办法的话,在Hibernate中使用jsonb的优缺点是什么?

93ze6v8z

93ze6v8z1#

谢谢Vlad Mihalcea,我们有这样的机会!)
他创建了hibernate-types库:

<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;
}

更多信息:12

0vvn1miw

0vvn1miw2#

@Cepr0-s的答案是正确的,但我有一些问题。我在尝试使用PostgreSQL org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111时遇到了异常。在我的例子中,解决这个问题的方法是添加自定义的hibernate方言。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"
kkbh8khc

kkbh8khc3#

更新Hibernate 6+(2022+)

随着Hibernate 6的出现,Map到PostgreSQL JSON(B)已经成为可能。
只需要用JdbcTypeCode(SqlTypes.JSON)注解字段。

非类型化JSON:

@Entity
public class Entity {
    ...
    @JdbcTypeCode(SqlTypes.JSON)
    private Map<String, String> payload;
    ...
}

(虽然不是每个JSON都会序列化为Map)。

使用序列化为自定义Java类型的JSON:

public class Foo implements Serializable {
  
    private String strValue;
    private Long longValue;
  
    public String getStrValue() {
        return strValue;
    }
  
    public void setStringProp(String stringProp) {
        this.strValue = strValue;
    }
  
    public Long getLongValue() {
        return longProp;
    }
  
    public void setLongValue(Long longValue) {
        this.longValue = longValue;
    }
}

@Entity
public class Entity {
    ...
    @JdbcTypeCode(SqlTypes.JSON)
    private Foo fooJson;
    ...
}

请参阅本文以获取更多示例:https://thorben-janssen.com/persist-postgresqls-jsonb-data-type-hibernate/

相关问题