将实体迁移到HRD时@Parent键变为null

时间:2012-09-15 12:15:27

标签: java google-app-engine google-cloud-datastore objectify

我正在将现有的Google AppEngine应用程序从主从数据存储区(MSD)移动到新的高复制数据存储区(HRD)。 该应用程序是用Java编写的,使用Objectify 3.1进行持久化。

在我的旧(MSD)应用程序中,我有一个像:

这样的实体
public class Session {
  @Id public Long id;
  public Key<Member> member;
  /* other properties and methods */
}

在新的(HRD)应用程序中,我将其更改为:

public class Session {
  @Id public Long id;
  // HRD: @Parent is needed to ensure strongly consistent queries.
  @Parent public Key<Member> member;
  /* other properties and methods */
}

我需要Session对象与其父成员对象强烈一致。

当我使用Google的HR​​D迁移工具迁移(我的应用程序的副本)时,所有成员和会话都在那里。但是,Session对象的所有成员属性都为空。显然,这些属性不会迁移。

我准备重新使用Session对象,但如果member属性为null,那是不可能的。谁能解释我做错了什么,如果这个问题可以解决?

1 个答案:

答案 0 :(得分:1)

@Id和@Parent不是底层实体中的“真实”属性。它们是定义实体的关键的一部分; Objectify将它们映射到POJO上的属性。

您尝试进行的转换是GAE中更复杂的问题之一。请记住,具有不同父级的实体(例如,某些值与null)是不同的实体;它有一个不同的关键。例如,加载具有空父项的实体,将父项设置为值并保存实体,不会更改实体 - 它会创建一个新实体。您仍然需要删除旧实体并更新任何外键引用。

您最好的选择是使用常规“成员”字段导入数据。你也可以拥有@Parent字段(称之为任何东西;你可以随时重命名它,因为它不是“真正的”属性)。迁移后,传递数据:

  1. 加载每个会话
  2. 检查null parentMember。如果为null:
  3. 分配parentMember并保存实体
  4. 删除null parentMember
  5. 的实体

    如果这样做,请非常小心外键引用。