我正在尝试使用 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;
}
}
Currently, I just get the error "ERROR: column "event_data" is of type jsonb but the expression is of type bytea" when I try to persist this object. I'm aware why it is but I don't know how to write a converter since I don't understand in what type should I convert the JsonObject type for it to get passed like jsonb.
Here is what I mean in this converter sample:
@Converter(autoApply = true)
public class AppAttributeTypeAttributeConverter implements AttributeConverter<JsonObject, ???> {
@Override
public ??? convertToDatabaseColumn(JsonObject eventData) {
return ???;
}
@Override
public JsonObject convertToEntityAttribute(??? eventData) {
return ???;
}
}
And here is snippet for persisting:
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);
Thanks in advance!
以下是您可以做的可能有效的事情:
改变
@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);
我希望它有所帮助!
请参阅如何使用 Hibernate 将 String JPA 属性映射到 JSON 列
谢谢...
编辑:-
@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 找到的。
在这里看看:stackoverflow.com/questions/39830842 /...
Thanks! But, this would probably work with Hibernate implementation and is not for EclipseLink.