我在 AppEngine 上使用 Objectify 来持久化实体。
在几个实体中,我想存储creationTime 和lastUpdateTime。
我的意图是在第一次创建实体时将 creationTime 添加到实体中。而 LastUpdate 时间应该更新,只要实体更新。
对于 lastUpdateTime,我可以轻松地使用@PrePersist
附加挂钩来修改 lastUpdateTime。
但是每当我对实体进行更新时,我都想保留creationTime。
现在一种解决方案是获取 creationTime,然后将其添加到我的实体中。
有什么方法我不必在每次保存之前获取 creationTime ?
我尝试了组合,@NotSaved(IfNull)
然后将 creationTime 设置为 null 希望 Objectify 会忽略这一点,但实际行为是它将在数据存储上设置 creationTime=null。
作为参考,我的实体如下所示:
public class TestEntity {
@Id
Long id;
Date creationTime;
Date lastUpdateTime;
String mutableField;
...
// Constructor1
public TestEntity(Long id, Date date, String mutableField) {
this.id = id;
creationTime = date;
lastUpdateTime = date;
this.mutableField = mutableField;
}
// Constructor2
public TestEntity(Long id, String mutableField) {
this.id = id;
lastUpdateTime = new Date();
this.mutableField = mutableField;
}
}
编辑1:
对不起。我认为我的问题不完整。我修改了我的 TestEntity 定义。让我们假设这个 TestEntity 包含两个不可变字段(id,creationTime)和两个可变字段(lastUpdateTime,mutableField2)。
现在根据上下文,有可能这五个字段都发送给客户端,然后客户端更新 mutableFields 并发送更新可变字段的请求。
为了讨论的简单,让我们假设使用 Session 和其他一些方式(例如 NameSpace),我们可以确保允许 User 修改这个实体。
现在我的意图是执行以下操作:
* 第一次创建实体时,使用构造函数1。
* 当客户端请求这个实体时,服务器发送(id 和 mutablefield)。
* 客户端发送请求以使用 mutableField 的新值和 Id 更新实体。
* 现在在服务器端,我想在不丢失创建时间的情况下更新可变字段。
现在这可以通过首先从 DataStore 中获取实体,然后更新 mutableField 并再次持久化来完成。我想知道是否有更好的解决方案。