【问题标题】:Objectify : How to Migrate an Entity with a String ID to a Long IDObjectify:如何将具有字符串 ID 的实体迁移到长 ID
【发布时间】:2015-06-30 16:23:28
【问题描述】:

我正在尝试将带有 @Id 字符串的实体类更改为带有长 @Id 的类,这里是类:

@Entity
public class MyClass extends EntityBaseString{
    private static final long serialVersionUID = 1L;
    private Ref<MyClass> parent;
    private List<Ref<MyClass>> list = new ArrayList<Ref<MyClass>>();

    public MyClass(){}
    //getters and setters omited
}

我想要将超类从EntityBaseString 更改为EntityBaseLong,但我想知道更好的方法是什么?

我试图将它复制到另一个名为 MyClassV2 的实体,该实体扩展了 EntityBaseLong,并且我已将 MyClass 实体复制到 MyClassV2 实体。但问题是MyClassentities 被很多其他实体引用,所以如果我使用MyClassV2,模型上会有很多变化。

我正在使用 Objectify v4。

【问题讨论】:

  • 我想知道你为什么要这样做。
  • 我需要这样做,因为有问题的类首先被认为是唯一的(我使用带有实体名称的字符串 ID 来获得唯一性行为)。但是现在,流程移动了,并且该实体不必是唯一的,因此我正在尝试将其迁移到 Long Id 实体。我正在考虑根据实体内容制作一个唯一的字符串哈希。我更喜欢迁移到 Long IDs 实体,但我有很多代码要更改才能以这种方式迁移。

标签: java google-app-engine objectify


【解决方案1】:

目前没有关于这方面的好故事。更改对象标识很困难,因为它确实代表了复制和删除操作。 Objectify 目前不原谅尝试将 Long id 加载到 String id 中,反之亦然……这样做很危险,因为加载然后保存操作实际上是复制操作。

远程优雅处理此问题的唯一方法是允许将@Id 字段指定为对象,并使其为 Long 或 String。然后您可以自行管理复制/删除。 Objectify 目前不允许这样做,但您可以请求它作为增强功能:https://github.com/objectify/objectify/issues

【讨论】:

  • 谢谢!我将在 GitHub 上添加一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多