我正在使用GAE Java构建一个Web应用程序。我有一个使用Long ID(由appengine生成)作为主键的类。
我现在想要创建一个新类,它将成为这个原始类的父类(一对多关系),但是孩子需要一个类型为“key”的主键,而不是我现在拥有的长ID 。
对于现有的持久化实体,将主键更改为“key”而不是long的最佳方法是什么?我应该创建一个具有“key”类型的主键的新类,并实例化并持久化复制旧值的字段值的新对象吗?或者我可以以某种方式更新现有的类?
由于
答案 0 :(得分:3)
事实上,持久化实体的密钥被认为是不可变的。毫无疑问,更改密钥将等同于更改已使用的实例。我建议你将你的初始对象链接到你创建的父对象的孩子。
答案 1 :(得分:0)
您可以将现有的长ID存储在父类的列表中:这将创建必要的一对多父子关系。
您必须自己管理一致性(如果您的网站没有非常高的流量,这可能不会太困难),并且父类和子类不会在同一个实体组中(对事务的影响)。
更改密钥意味着更改实体本身(及其实体组)。
最终,适合您的解决方案将取决于您的问题的具体细节。例如,是否已有很多现有数据?这是一个实时应用程序(即它是否已被使用)?
另一种解决方案可能是将您的应用迁移到不同的(更适合的)数据模型,并逐个帐户(通过在短时间内锁定帐户)这样做。这样,只有少数人会受到更改的影响(如果他们在迁移帐户时碰巧访问了应用程序),而不是整个应用程序都崩溃了。