我有一个包含设置列表的用户实体。最初我使用List但使用Map返回一个更容易搜索的JSON。
列出版本:
实体中的数据库列声明:
private List<Setting> settings = new ArrayList<>();
在GET上呈现JSON:
"settings": [
{"name1" : "setting 1", "value" : 5},
{"name2" : "setting 2", "value" : 6},
]
JSON贴片:
[{"op":"replace","path":"/settings/0/value", "value": "6"}]
地图版本:
实体中的数据库列声明:
@MapKey(name = "name")
private Map<String, Setting> settings = new HashMap<>();
在GET上呈现JSON:
"settings": {
"name1": {"name1" : "setting 1", "value" : 5},
"name2": {"name2" : "setting 2", "value" : 6},
}
如何打补丁?试过这个,但它不起作用。杰克逊想在我的POJO中找到一个名为name1
的房产。
[{"op":"replace","path":"/settings/name1/value", "value": "6"}]
答案 0 :(得分:1)
由于您希望将settings
字段设为Map
,因此您可以通过以下方式实现该字段:
@ElementCollection(fetch = FetchType.EAGER)
@MapKeyColumn(name = "settings_name")
@Column(name = "settings_value")
@CollectionTable(name = "entity_settings", joinColumns = @JoinColumn(name = "entity"))
private final Map<String, String> settings = new HashMap<>();
现在要添加或替换设置,您需要做的就是在实体端点PATCH /entity/id
上使用请求正文中的JSON对象进行PATCH调用:
Content-Type: application/json
PATCH /entity/id
{
"settings": {
"name1": "5"
}
}
以上请求会创建一个新设置,其中包含密钥name
和值5
,如果它尚未存在,则替换该值。
我认为Setting
不必是一个实体,并且可以由包含实体完全拥有。除非您希望Setting
可以单独访问,但正如您在评论中所说的那样,它没有自己的存储库,我认为情况并非如此。