我在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;
}
}
Edit1:
抱歉。我想我的问题是完整的。我修改了TestEntity定义。我们假设这个TestEntity包含两个不可变字段(id,creationTime)和两个可变字段(lastUpdateTime,mutableField2)。
现在,根据上下文,可能会将所有这五个字段发送到客户端,然后客户端更新mutableField并发送更新可变字段的请求。
为了简化讨论,让我们假设使用Session和其他一些方式(例如NameSpace),我们可以确保允许User修改此实体。
现在我的意图是做以下事项:
*首次创建实体时,请使用constructor1
*当客户端要求此实体时,服务器发送(id和mutablefield)
*客户端发送请求以使用mutableField的新值以及Id更新实体
*现在在服务器端,我想更新可变字段而不会丢失creationTime。
现在可以通过首先从DataStore获取实体,然后更新mutableField然后再次持久来完成此操作。我想知道是否有更好的解决方案。
答案 0 :(得分:1)
使用您的构造函数。
public class TestEntity {
public TestEntity(...your normal init params...) {
creationTime = new Date();
}
}