Java 对象到 postgres jsonb 转换
Java object to postgres jsonb conversion
我正在尝试使用 eclipselink 将 java 对象持久保存到 jsonb 列到 Postgres 数据库中,但我目前无法编写适当的转换器。任何人都可以帮助我或给我一个在 java 中使用 eclipselink 持久化 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;
}
}
目前,当我尝试保留此对象时,我只收到错误 "ERROR: column "event_data" is of type jsonb but the expression is of type bytea"。我知道这是为什么,但我不知道如何编写转换器,因为我不明白我应该将 JsonObject 类型转换成什么类型才能像 jsonb 一样传递。
我在这个转换器示例中的意思是:
@Converter(autoApply = true)
public class AppAttributeTypeAttributeConverter implements AttributeConverter<JsonObject, ???> {
@Override
public ??? convertToDatabaseColumn(JsonObject eventData) {
return ???;
}
@Override
public JsonObject convertToEntityAttribute(??? eventData) {
return ???;
}
}
这里是持久化的片段:
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);
提前致谢!
以下是您可以执行的操作:
改变
@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 找到的。
我正在尝试使用 eclipselink 将 java 对象持久保存到 jsonb 列到 Postgres 数据库中,但我目前无法编写适当的转换器。任何人都可以帮助我或给我一个在 java 中使用 eclipselink 持久化 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;
}
}
目前,当我尝试保留此对象时,我只收到错误 "ERROR: column "event_data" is of type jsonb but the expression is of type bytea"。我知道这是为什么,但我不知道如何编写转换器,因为我不明白我应该将 JsonObject 类型转换成什么类型才能像 jsonb 一样传递。
我在这个转换器示例中的意思是:
@Converter(autoApply = true)
public class AppAttributeTypeAttributeConverter implements AttributeConverter<JsonObject, ???> {
@Override
public ??? convertToDatabaseColumn(JsonObject eventData) {
return ???;
}
@Override
public JsonObject convertToEntityAttribute(??? eventData) {
return ???;
}
}
这里是持久化的片段:
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);
提前致谢!
以下是您可以执行的操作:
改变
@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 找到的。