客观化中的ids和n与m关系的模式迁移

时间:2016-03-18 08:41:05

标签: java google-app-engine objectify

如果拥有以前具有String ID的User实体。我想迁移到一个看似简单的Long id:

public class UserEntity  {
   /*@Id*/
   @Index String oldId;
   @Id Long newId;
  /* other indexed fields I use for loading the entity */

  private List<Ref<ReferencedEntity>> collections;
}

public class ReferencedEntity {
   private List<Ref<User>> owners;
}

由于我通过不同的字段加载用户,我可以检查用户是否有空newId,如果是这样,只有null旧的将其保存回来,以便自动生成器在{{1}中设置新的Id }} field。

现在问题是我与其他实体的关系。我该如何迁移?我双方都有newId,所以我想我可以在用户实体端加载refs并用新Id替换另一端。

一般问题是如果一方需要新的身份证如何将n转换为m关系?

1 个答案:

答案 0 :(得分:1)

您可能正在考虑使用关系数据库策略。当您更新一侧的值时,另一侧将不会更新,因此您必须更新两个实体。由于这是NoSql,你必须以不同的方式思考。

我会采取这种策略。

首先加载“旧”用户实体并将其再次保存在新结构中。一旦确认已加载的所有数据都已转换为新对象(我建议使用BigQuery),那么您应该使用索引的oldId为每个引用的实体生成一个任务,并更新ReferencedEntity中所有者的引用。 / p>

加载需要一段时间,但这可能是一种安全的方法。