【问题标题】:How to save json Object in postgresql using Hibernate in java?如何在 java 中使用 Hibernate 在 postgresql 中保存 json 对象?
【发布时间】:2020-09-25 15:31:28
【问题描述】:

我在 java 中有一个 json 对象,我想使用 hibernate 将该对象保存在 PostgreSQL 数据库中

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

但是 hibernate 不提供到这些数据类型的映射,我被卡住了,该怎么做。

我看了很多,发现“Persist a JSON Object Using Hibernate”或Hibernate中的自定义类型和@Type Annotation

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

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

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

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

【问题讨论】:

    标签: java json postgresql hibernate


    【解决方案1】:

    是的,你需要一个custom Hibernate Type,但是,不是自己创建一个,Vlad Mihalcea 已经为你做了(here)。我也在用。

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

    就是这样!

    【讨论】:

    • 所以我不需要在这里点击这个链接。 thorben-janssen.com/…
    • 我现在很困惑。尝试了很多东西似乎都没有工作。您能否提供一个工作示例。 “一个非常简单的例子让你开始:”我很抱歉,但仍然无法跟进。
    • 这节课会讲什么
    • @MappedSuperclass public class BaseEntity { }
    • 所有实体共有的任何东西,例如它的 ID、createdBy、createdTime 等。
    【解决方案2】:

    在 postgres 中创建一个表

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

    我创建了一个休眠实体类作为 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());
        }
    }
    

    输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2016-04-23
      • 2015-03-01
      • 2017-06-22
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多