将应用程序引擎JDO应用程序移植到MySql后端

时间:2014-04-15 04:49:05

标签: java mysql google-app-engine jdo datanucleus

我有一个使用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或从String转换为实际的JDO首要的关键。我不愿意这样做,因为它似乎很乱,但我无法弄清楚如何做到这一点。

1 个答案:

答案 0 :(得分:0)

如果您使用“Key”进行关系(即将您的模型混淆以适应那些GAE数据存储限制),那么您将无法直接针对RDBMS运行它(如果您希望等同于RDBMS中的关系和FK)。那些需要改变为相关对象的真实对象引用。

至于班级的PK,我记得有人指的是2009年GAE推出GAE“应用程序”(以Key为主键字段等)并在某些人帮助下的IBM视频包含Key类等的小jar,使其可以对RDBMS运行;在一段时间内没有看到它,也许在YouTube上?或者,您可以为Key类型提供DataNucleus“TypeConverter”,看看它是否有用?