繁体   English   中英

How to save json Object in postgresql using Hibernate in java?

[英]How to save json Object in postgresql using Hibernate in java?

I have a json object in java and I want to save that Object in PostgreSQL database using hibernate .

我检查了 PostgreSQL 它提供了 json 和 jsonb 数据类型。

但是 hibernate 不提供到这些数据类型的映射,我被卡住了,如何 go 关于它。

I looked quite a bit and found " Persist a JSON Object Using Hibernate " or Custom Types in Hibernate and the @Type Annotation

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

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

但由于我对 hibernate 很陌生,我不确定这些是否是我需要的,或者 hibernate 确实提供了 json 数据的映射,我只是不知道。

我希望有人可以指导我,因为正确的方法是什么? 谢谢

是的,您将需要一个自定义的 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();


}

而已!

在 postgres 中创建一个表

CREATE TABLE demoJson(
    id SERIAL NOT NULL PRIMARY KEY,
    jsonData JSONB NOT NULL
);

我创建了一个 hibernate 实体 class 作为 DemoJsonEnitity 并定义了 @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());
    }
}

Output

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM