0

我正在将现有的 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 对象与其父 Member 对象高度一致。

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

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

4

1 回答 1

1

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

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

最好的办法是使用常规的“成员”字段按原样导入数据。您还可以拥有@Parent 字段(可以任意命名;您可以随时重命名它,因为它不是“真实”属性)。迁移后,通过您的数据:

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

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

于 2012-09-16T20:49:05.130 回答