【问题标题】:Need to update the primary key on existing objects in GAE Java需要更新 GAE Java 中现有对象的主键
【发布时间】:2010-02-02 19:04:01
【问题描述】:
我正在使用 GAE Java 构建一个 Web 应用程序。我有一个使用 Long ID(由 appengine 生成)作为其主键的类。
我现在想创建一个新类,它将成为这个原始类的父类(一对多关系)但是孩子需要有一个“key”类型的主键,而不是我现在拥有的 Long ID .
对于现有的持久化实体,将主键更改为“key”类型而不是 long 类型的最佳方法是什么?我应该创建一个主键类型为“key”的新类,并实例化和持久化从旧对象复制字段值的新对象吗?或者我可以以某种方式更新现有的课程吗?
谢谢
【问题讨论】:
标签:
java
google-app-engine
primary-key
jdo
object-persistence
【解决方案1】:
实际上,持久化实体的 Key 被认为是不可变的。毫无疑问,更改密钥将等同于更改使用的实例。我建议您将初始对象链接到您创建的父对象的子对象。
【解决方案2】:
您可以将现有的 Long ID 存储在父类的列表中:这将创建必要的一对多父子关系。
但是,您必须自己管理一致性(如果您的网站没有很高的流量,这可能不会太困难),并且父类和子类不会在同一个实体组中(对事务的影响)。
更改密钥意味着更改实体本身(以及它的实体组)。
最终,适合您的解决方案将取决于您的问题的具体情况。例如,是否已经有很多现有数据?这是一个实时应用程序(即,它是否已经在使用)?
另一种解决方案可能是将您的应用迁移到不同(更适合)的数据模型,并逐个帐户进行迁移(通过在短时间内锁定帐户)。这样一来,只有少数人会受到更改的影响(如果他们在您迁移他们的帐户时碰巧访问了该应用),而不是整个应用都停机。