需要更新GAE Java中现有对象的主键

时间:2010-02-02 19:04:01

标签: java google-app-engine primary-key jdo object-persistence

我正在使用GAE Java构建一个Web应用程序。我有一个使用Long ID(由appengine生成)作为主键的类。

我现在想要创建一个新类,它将成为这个原始类的父类(一对多关系),但是孩子需要一个类型为“key”的主键,而不是我现在拥有的长ID 。

对于现有的持久化实体,将主键更改为“key”而不是long的最佳方法是什么?我应该创建一个具有“key”类型的主键的新类,并实例化并持久化复制旧值的字段值的新对象吗?或者我可以以某种方式更新现有的类?

由于

2 个答案:

答案 0 :(得分:3)

事实上,持久化实体的密钥被认为是不可变的。毫无疑问,更改密钥等同于更改已使用的实例。我建议你将你的初始对象链接到你创建的父对象的孩子。

答案 1 :(得分:0)

您可以将现有的长ID存储在父类的列表中:这将创建必要的一对多父子关系。

您必须自己管理一致性(如果您的网站没有非常高的流量,这可能不会太困难),并且父类和子类不会在同一个实体组中(对事务的影响)。

更改密钥意味着更改实体本身(及其实体组)。

最终,适合您的解决方案将取决于您的问题的具体细节。例如,是否已有很多现有数据?这是一个实时应用程序(即它是否已被使用)?

另一种解决方案可能是将您的应用迁移到不同的(更适合的)数据模型,并逐个帐户(通过在短时间内锁定帐户)这样做。这样,只有少数人会受到更改的影响(如果他们在迁移帐户时碰巧访问了应用程序),而不是整个应用程序都崩溃了。