我正在将现有的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的HRD迁移工具迁移(我的应用程序的副本)时,所有成员和会话都在那里。但是,Session对象的所有成员属性都为空。显然,这些属性不会迁移。
我准备重新使用Session对象,但如果member属性为null,那是不可能的。谁能解释我做错了什么,如果这个问题可以解决?
答案 0 :(得分:1)
@Id和@Parent不是底层实体中的“真实”属性。它们是定义实体的关键的一部分; Objectify将它们映射到POJO上的属性。
您尝试进行的转换是GAE中更复杂的问题之一。请记住,具有不同父级的实体(例如,某些值与null)是不同的实体;它有一个不同的关键。例如,加载具有空父项的实体,将父项设置为值并保存实体,不会更改实体 - 它会创建一个新实体。您仍然需要删除旧实体并更新任何外键引用。
您最好的选择是使用常规“成员”字段导入数据。你也可以拥有@Parent字段(称之为任何东西;你可以随时重命名它,因为它不是“真正的”属性)。迁移后,传递数据:
如果这样做,请非常小心外键引用。