Eclipselink - 将列表转换为字符串(通过 gson):坚持后无法更新字符串
Eclipselink - Convert a List to a String (via gson) : after persist the string can't be updated
Payara 4.1.2.181(和相应的 eclipselink 版本)
大家好,
我想将表示注释的实例列表(作为字符串、用户 ID 和日期)存储为 json 字符串,因此我使用属性转换器将列表转换为字符串:
@Converter(autoApply = true)
public class NotesAttributeConverter implements AttributeConverter<List<Note>, String> {
private Gson gson = new Gson();
@Override
public String convertToDatabaseColumn(List<Note> notes) {
return gson.toJson(notes);
}
@Override
public List<Note> convertToEntityAttribute(String string) {
return gson.fromJson(string, new TypeToken<List<Note>>(){}.getType());
}
}
这是实体端的字段:
@Column(name = "note", columnDefinition = "text")
@Getter @Setter
private List<Note> notes;
我可以很好地保留带有注释的实体,问题是当我想合并实体时,'notes' 字段永远不会在数据库上更新:数据库字段永远不会更新,它确实甚至不要尝试合并实体,因为乐观锁不会改变。
你知道发生了什么事吗?我做错了什么,应该是这样还是一个错误?
谢谢!
我问了 the same question on Eclipse's forums 并得到了答案,或者更确切地说 答案。
默认情况下,如 here 所述,列表被 eclipselink 认为是不可变的,这意味着您可以向列表添加或删除内容,但只要您不分配 'new' 列出字段 eclipselink 不会尝试合并它。
因此,要使其正常工作,您需要分配一个新列表,或者需要使用 @Mutable 注释该字段。
新列表示例:
notes.add(newNote);
notes = new ArrayList<>(notes);
注释示例:
@Mutable
@Column(name = "note", columnDefinition = "text")
@Getter @Setter
private List<Note> notes;
非常感谢 eclipse 论坛的 Chris Delahunt。
Payara 4.1.2.181(和相应的 eclipselink 版本)
大家好,
我想将表示注释的实例列表(作为字符串、用户 ID 和日期)存储为 json 字符串,因此我使用属性转换器将列表转换为字符串:
@Converter(autoApply = true)
public class NotesAttributeConverter implements AttributeConverter<List<Note>, String> {
private Gson gson = new Gson();
@Override
public String convertToDatabaseColumn(List<Note> notes) {
return gson.toJson(notes);
}
@Override
public List<Note> convertToEntityAttribute(String string) {
return gson.fromJson(string, new TypeToken<List<Note>>(){}.getType());
}
}
这是实体端的字段:
@Column(name = "note", columnDefinition = "text")
@Getter @Setter
private List<Note> notes;
我可以很好地保留带有注释的实体,问题是当我想合并实体时,'notes' 字段永远不会在数据库上更新:数据库字段永远不会更新,它确实甚至不要尝试合并实体,因为乐观锁不会改变。
你知道发生了什么事吗?我做错了什么,应该是这样还是一个错误?
谢谢!
我问了 the same question on Eclipse's forums 并得到了答案,或者更确切地说 答案。
默认情况下,如 here 所述,列表被 eclipselink 认为是不可变的,这意味着您可以向列表添加或删除内容,但只要您不分配 'new' 列出字段 eclipselink 不会尝试合并它。 因此,要使其正常工作,您需要分配一个新列表,或者需要使用 @Mutable 注释该字段。
新列表示例:
notes.add(newNote);
notes = new ArrayList<>(notes);
注释示例:
@Mutable
@Column(name = "note", columnDefinition = "text")
@Getter @Setter
private List<Note> notes;
非常感谢 eclipse 论坛的 Chris Delahunt。