2

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

4

1 回答 1

1

使用您的构造函数。

public class TestEntity {
    public TestEntity(...your normal init params...) {
        creationTime = new Date();
    }
}
于 2012-04-26T16:59:41.133 回答