如何使用Hibernate在Java中将JSON对象保存到PostgreSQL中?

3
我有一个Java中的JSON对象,想使用Hibernate将其保存到PostgreSQL数据库中。我查看了PostgreSQL,它提供了JSON和JSONB数据类型。但是Hibernate没有提供这些数据类型的映射,我陷入了困境,不知道该怎么做。我查找了很多资料,发现了“使用Hibernate持久化JSON对象”或者“Hibernate中的自定义类型和@Type注释”。

https://www.baeldung.com/hibernate-persist-json-object

https://www.baeldung.com/hibernate-custom-types

但是由于我对Hibernate还很陌生,所以我不确定这些是否就是我需要的,或者Hibernate是否提供了JSON数据的映射,而我只是不知道而已。
希望有人能指导我,什么才是正确的方法?谢谢。
2个回答

3

是的,你需要一个自定义Hibernate类型,但是,不需要自己创建,Vlad Mihalcea已经为您创建了一个(在这里)。我也在使用它。

Maven依赖

首先,在pom.xml文件中添加以下依赖项:

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

JPA实体映射

随后,您可以定义一个@TypeDef映射来注册JSON类型:

@TypeDefs({
    @TypeDef(name = "json", typeClass = JsonStringType.class),
    @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
@MappedSuperclass
public class BaseEntity {

}

@Entity
@Table(name = "foo")
public class Foo extends BaseEntity {


    @Type(type = "jsonb")
    @Column(name = "someJsonColumn")
    private Map<String, Object> someJsonField = Maps.newHashMap();


}

就是这样!


所以我不需要跟踪这里的链接。https://thorben-janssen.com/persist-postgresqls-jsonb-data-type-hibernate/ # - John
1
我现在非常困惑。尝试了很多方法,但似乎都没有起作用。你能否提供一个可行的示例呢?"这是一个非常简单的示例,可以帮助你入门:"非常抱歉,但我仍然无法跟进。 - John
这个类里面会放什么? - John
@MappedSuperclass public class BaseEntity {} - John
所有实体共同拥有的属性,例如其ID、创建者、创建时间等。 - Ken Chan

0
在Postgres中创建一个表。
CREATE TABLE demoJson(
    id SERIAL NOT NULL PRIMARY KEY,
    jsonData JSONB NOT NULL
);

我创建了一个名为DemoJsonEnitity的Hibernate实体类,并定义@TypeDefs。
@Entity
@Table(name = "demoJson")
@TypeDefs({
    @TypeDef(name = "json", typeClass = JsonStringType.class)
    ,
    @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
public class DemoJsonEnitity implements Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id")
    private int dataId;

    @Type(type = "jsonb")
    @Column(name = "jsonData", columnDefinition = "jsonb")
    private String jsonData;

    public int getDataId() {
        return dataId;
    }

    public void setDataId(int dataId) {
        this.dataId = dataId;
    }

    public String getJsonData() {
        return jsonData;
    }

    public void setJsonData(String jsonData) {
        this.jsonData = jsonData;
    }

}

就是这样。非常简单,我使用了这个依赖项

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

为了检查,我尝试将数据保存为

public static void main(String arg[]) {
    try {
        DemoJsonEnitity obj = new DemoJsonEnitity();
        JSONObject jsonObj = new JSONObject();
        Map m1 = new LinkedHashMap(2);
        m1.put("oldValue", "Active");
        m1.put("newValue", "InActive");
        jsonObj.put("status", m1);
        Map m2 = new LinkedHashMap(2);
        m2.put("oldValue", "Test 6");
        m2.put("newValue", "Test 6 updated");
        jsonObj.put("taskDetails", m2);
        obj.setJsonData(jsonObj.toString());
        Session session = null;
        Transaction tx = null;
        try {
            session = sf.openSession();
            tx = session.beginTransaction();
            session.save(obj);
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            throw new RuntimeException(e);
        } finally {
            session.close();
        }
    } catch (Exception e) {
        System.out.println("error: " + e.getMessage());
    }
}

输出

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接