如何为AppEngine实体添加creationTime

时间:2012-04-26 06:53:05

标签: java google-app-engine objectify

我在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然后再次持久来完成此操作。我想知道是否有更好的解决方案。

1 个答案:

答案 0 :(得分:1)

使用您的构造函数。

public class TestEntity {
    public TestEntity(...your normal init params...) {
        creationTime = new Date();
    }
}