【问题标题】:Java object to postgres jsonb conversionJava 对象到 postgres jsonb 的转换
【发布时间】:2020-06-29 13:14:35
【问题描述】:

我正在尝试使用 eclipselink 将 java 对象持久保存到 jsonb 列中的 Postgres 数据库中,但我目前正在编写适当的转换器。任何人都可以帮助我或给我一个使用eclipselink在java中持久化jsonb类型的好例子吗?

这是型号代码:

@Entity
@Table(name = TABLE_NAME)
public class SystemEventModel implements Serializable {

   public static final String TABLE_NAME = "system_event";

   @Id
   @Column(name = "id")
   private Long id;

   @Lob
   @Column(name = "event_data", columnDefinition = "jsonb")
   private JsonObject eventData;

   public SystemEventModel(JsonObject eventData) {
        this.eventData = eventData;
    }       
}

目前,当我尝试持久化此对象时,我只收到错误“错误:列“event_data”是 jsonb 类型,但表达式是 bytea 类型”。我知道为什么会这样,但是我不知道如何编写转换器,因为我不明白应该将 JsonObject 类型转换为哪种类型才能像 jsonb 一样传递。

这就是我在这个转换器示例中的意思:

@Converter(autoApply = true)
public class AppAttributeTypeAttributeConverter implements AttributeConverter<JsonObject, ???> {

    @Override
    public ??? convertToDatabaseColumn(JsonObject eventData) {
        return ???;
    }

    @Override
    public JsonObject convertToEntityAttribute(??? eventData) {
        return ???;
    }
}

这里是用于持久化的 sn-p:

    String details = "{ \"pressed\": \"yes\", \"isDefault\": \"true\", \"type\": \"BUTTON\"}";
    JsonReader jsonReader = Json.createReader(new StringReader(details));
    JsonObject jsonObject = jsonReader.readObject();
    jsonReader.close();
    SystemEventModel eventModel = new SystemEventModel(jsonObject);
    em.persist(eventModel);

提前致谢!

【问题讨论】:

标签: java postgresql eclipselink jsonb converters


【解决方案1】:

以下是您可以执行的操作:

改变

 @Lob
 @Column(name = "event_data", columnDefinition = "jsonb")
 private JsonObject eventData;

 @Lob
 @Type(type = "jsonb")
 @Column(name = "event_data", columnDefinition = "jsonb")
 private String eventData;

 public SystemEventModel(String eventData) {
    this.eventData = eventData;
 }

然后使用这个来坚持:

String details = "{ \"pressed\": \"yes\", \"isDefault\": \"true\", \"type\": \"BUTTON\"}";
SystemEventModel eventModal = new SystemEventModel(details); // or you can use setter method.
em.persist(eventModel);

希望对你有帮助!

参考How to map a String JPA property to a JSON column using Hibernate

谢谢...

编辑:-

  @Override
  public Object convertToDatabaseColumn(JsonObject eventData) {
    try {
      PGobject out = new PGobject();
      out.setType("json");
      out.setValue(eventData.toString());
      return out;
    } catch (Exception e) {
      throw new IllegalArgumentException("Unable to serialize to json field ", e);
    }
  }

  @Override
  public JsonObject convertToEntityAttribute(Object eventData) {
    try {
      if (eventData instanceof PGobject && ((PGobject) eventData).getType().equals("json")) {
        return mapper.reader(new TypeReference<JsonObject>() {
        }).readValue(((PGobject) eventData).getValue());
      }
      return Json.createObjectBuilder().build();
    } catch (IOException e) {
      throw new IllegalArgumentException("Unable to deserialize to json field ", e);
    }
  }

这是我为 JPA 找到的解决方案,不是专门针对 hibernate 或 eclipselink。

【讨论】:

  • 谢谢!但是,这可能适用于 Hibernate 实现,不适用于 EclipseLink。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多