【发布时间】:2014-04-15 04:49:05
【问题描述】:
我有一个使用 JDO 的大小合适的 App Engine 应用程序,我想使用 DataNucleus 将它移植到 MySql 后端。我预计这不会太难。然而,我遇到的一件事是主键。
App Engine 使用 Key 类来表示主键。这个类基本上是几个字符串的组合,指示对象的类型和名称,加上对父键的可选引用(直到最上面的父键的整个键链构成完整的键)。我的关键声明如下所示:
@PersistenceCapable
class Whatever {
...
@PrimaryKey
private Key key;
...
}
我已准备好实现我自己的 Key 版本(及其关联的类 KeyFactory),但看起来我实际上可能无法像在 App Engine 中那样将它用作真正的主键。我看不到任何方法可以将这样的自定义类用作普通 DataNucleus JDO 的键。尽管文档似乎确实表明 DataNucleus 为每个主键创建了一个键类,但该键类通常是自动生成的,并且您实际上并未将该键类声明为要存储的类的成员。即使在你有多个主键的情况下,你确实定义了主键类,你将键的组成部分存储在你想要存储的类中:
@PersistenceCapable(objectIdClass=PersonPrimaryKey.class)
class Person {
@PrimaryKey
private String firstname;
@PrimaryKey
private String lastname;
// You can't do this:
// private PersonPrimaryKey;
...
}
class PersonPrimaryKey {
private String firstname; // has to match above
private String lastname; // has to match above
... // etc other methods
}
复合键实际上是最接近 App Engine 的东西,但最终我也看不出它们将如何解决我的问题,因为它们有类似的限制。
有什么想法吗?除了在 PrimaryKeys 中使用的 Key 对象之外,我还有很多地方可以存储其他类型对象的键(外键),以及在查询查找的其他地方使用的键,它遍布代码库。如果我必须解决这个问题,我将必须实现我自己的 Key 版本以用作参考类,然后添加一些额外的绑定来将 Key 类转换为 String 以用作实际的 JDO 主键.我宁愿不这样做,因为它看起来很乱,但我不知道该怎么做。
【问题讨论】:
标签: java mysql google-app-engine jdo datanucleus