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。