gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:10:09 25 4
gpt4 key购买 nike

我正在将现有 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 对象的所有成员属性都变为 null。显然,这些属性没有迁移。

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

最佳答案

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

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

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

  1. 加载每个 session
  2. 检查父成员是否为空。如果为空:
  3. 分配parentMember并保存实体
  4. 删除父成员为空的实体

如果这样做,请务必小心外键引用。

关于java - 将实体迁移到 HRD 时,@Parent 键变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12437293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com