【问题标题】:How can I store a JSON String into PostgreSQL if the column type is JSONB using JPA?如果列类型是使用 JPA 的 JSONB,我如何将 JSON 字符串存储到 PostgreSQL 中?
【发布时间】:2019-12-11 07:12:43
【问题描述】:

Hibernate 不支持这种情况吗?

我有办法做到这一点,它是:Use JSONB in JPA

但我无法判断它是否安全。 而且我确实知道我自己编写了相同的代码,但是官方没有提供一些简单的方法来做到这一点,例如添加@Type(type="jsonb") 之类的注释。

【问题讨论】:

  • 没有。因为没有像其他的标准 JSON 类型。使用您链接到的教程中提到的 Vlad 的休眠类型。这些就是为此而构建的。

标签: postgresql hibernate spring-data-jpa jsonb hibernate-types


【解决方案1】:

这是一个很常见的需求,所以我就这个话题写了a very detailed article

休眠类型项目

您需要做的第一件事是将hibernate-types 开源项目添加到您的 Maven 或 Gradle 配置文件中。

实体映射

之后,使用JsonBinaryType,如下所示:

@Entity(name = "Book")
@Table(name = "book")
@TypeDef(
    name = "jsonb",
    typeClass = JsonBinaryType.class
)
public static class Book {

    @Id
    @GeneratedValue
    private Long id;

    @NaturalId
    private String isbn;

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private String properties;

    //Getters and setters omitted for brevity
}

持久化实体

现在,当您持久化以下 Book 实体时:

entityManager.persist(
    new Book()
        .setIsbn("978-9730228236")
        .setProperties(
            "{" +
            "   \"title\": \"High-Performance Java Persistence\"," +
            "   \"author\": \"Vlad Mihalcea\"," +
            "   \"publisher\": \"Amazon\"," +
            "   \"price\": 44.99" +
            "}"
        )
);

Hibernate 将正确保存 JSON 属性:

INSERT INTO book (
    isbn,
    properties,
    id
)
VALUES (
    '978-9730228236',
    '{"title":"High-Performance Java Persistence","author":"Vlad Mihalcea","publisher":"Amazon","price":44.99}',
    1
)

获取实体

获取实体按预期工作:

Book book = entityManager
    .unwrap(Session.class)
    .bySimpleNaturalId(Book.class)
    .load("978-9730228236");

assertTrue(book.getProperties().contains("\"price\": 44.99"));

因此,您不必创建任何自定义 Hibernate 类型,因为您可以在 hibernate-types 项目中找到正确的类型。

【讨论】:

    猜你喜欢
    • 2022-08-12
    • 1970-01-01
    • 2020-09-17
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2021-02-20
    相关资源
    最近更新 更多