【发布时间】:2018-02-16 19:03:58
【问题描述】:
我有一个 JPA 实体,看起来像:
public final class Item implements Serializable {
@Column(name = "col1")
private String col1;
@Column(name = "col2")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String col2;
@Column(name = "col3")
private String col3;
Item() { }
public Item(String col1, String col2) {
this.col1 = col1;
this.col2 = col2;
col3 = col1 + col2 + "some other stuff";
}
// getters, equals, hashCode and toString
}
我希望能够坚持col3。我正在通过 POST 发送一个请求,如下所示:
{
"col1": "abc",
"col2": "def"
}
...我收到这样的信息:
[
{
"createdAt": "2017-09-07T19:18:17.04-04:00",
"updatedAt": "2017-09-07T19:18:17.04-04:00",
"id": "015e5ea3-0ad0-4703-af04-c0a3d46aa836",
"col1": "abc",
"col3": null
}
]
最终,col3 没有被持久化在数据库中。我没有任何二传手。
有什么办法可以做到吗?
更新
公认的解决方案是“侵入性较小”的解决方案。 Jarrod Roberson 提出的建议也完美无缺。最终,您可以通过在 col2 上使用 setter 并在那里设置 col3 的值来实现相同的效果——但我不喜欢这个……虽然是个人喜好。
【问题讨论】:
-
col3这样的字段被称为计算字段是有原因的,您始终可以从其他字段“计算”它们。你能提供一个有效的用例吗?为什么你不能用一个简单的 getter 来解决这个问题?类似:public String getCol3() { col1 + col2 + "some other stuff" }并删除col3属性。 -
@vl4d1m1r4 我一直都是这样,直到“需要将这个值持久化”也在数据库中。我之前在吸气剂中返回它。该字段实际上仅由
col2组成:最后 3 个字符(并且它永远不会改变)。我实际上可以修改用户代理来发送它,但这没有任何意义,因为我已经有了整个数据,我可以拆分它并获取所需的部分。
标签: java hibernate jpa spring-boot jackson