java - 无法在 GAE JDO 中持久化对象

标签 java google-app-engine jdo

我对 JDO 和 GAE 完全陌生,并且一直在努力让我的数据层保留任何代码!

我面临的问题可能很简单,但无论我尝试什么解决方案,我似乎都找不到任何方法。

首先是问题:(稍微简化,但仍包含所有必要的信息)
我的数据模型是这样的:

User:
    (primary key)
    String emailID
    String firstName

Car:
    (primary key)
    User user
    (primary key)
    String registration
    String model

这是最初的数据模型。我实现了一个 CarPK 对象来获取用户和注册的复合主键。然而,这遇到了各种各样的问题。 (我会留到另一个时间/问题)

然后我改变了设计:
用户:(不变)
Car:
(primary key)
String fauxPK (here fauxPK = user.getEmailID() + SEP + registration)
User user
String registration
String model

这对用户来说很好,它可以插入和检索用户对象。但是,当我尝试插入汽车对象时,出现以下错误:
"Cannot have a java.lang.String primary key and be a child object"

Found the following helpful link about it:
http://stackoverflow.com/questions/2063467/persist-list-of-objects

转到那里建议的链接,该链接解释了如何创建 key ,但是他们一直在谈论“实体组”和“实体组父级”。但我似乎找不到任何解释什么是“实体组”或“实体组父级”的文章或网站

我可以尝试摆弄更多东西来弄清楚我是否可以以某种方式存储一个对象,但我耐心地进行排序并且也宁愿理解和实现而不是反之亦然。

所以我会很感激任何涵盖所有这些要点的文档(即使它很大),并且最好有一些超出非常基本数据建模的示例。

感谢您阅读这么长的帖子:)

最佳答案

恐怕你不会喜欢这个答案。 GAE JDO 必须以非常特殊的方式使用,并且充满了限制,您必须遵守这些限制才能有效地使用它。向前和向后阅读文档。对于您现在看到的问题,您可能需要多次阅读本节:

http://code.google.com/appengine/docs/java/datastore/relationships.html

GAE JDO 拥有拥有和无主关系。有关拥有与未拥有的示例,请参阅上面的文档。相信你想要CarUser有一种无主的关系。请注意 Google App Engine 文档中关于无主关系的这一启示:

http://code.google.com/appengine/docs/java/datastore/relationships.html#Unowned_Relationships

In addition to owned relationships, the JDO API also provides a facility for managing unowned relationships. The App Engine implementation of JDO does not yet implement this facility, but don't worry, you can still manage these relationships using Key values in place of instances (or Collections of instances) of your model objects.



这实质上意味着,要使用 GAE JDO,您不应该对 Car 和 User 类之间的无主关系使用直接引用。相反,您应该在它们之间使用间接引用,即 Car 应该有一个用于用户键的字段,而不是直接引用用户本身。您遇到的一些麻烦是因为 GAE JDO 无法处理您如何在代码中对这种关系进行建模。

Asker 继续说:

Went to the link suggested there, that explains how to create Keys, however they keep talking about "Entity Groups" and "Entity Group Parents". But I cant seem to find any articles or sites that explain what are "Entity Group"s or an "Entity Group Parents"



实体集团 - a graph of objects that were initially persisted together .例如,因为 Car 直接引用一个 User,所以当你第一次持久化一个给定的 Car 实例时,你也会持久化它引用的 User 实例,这个 Car 实例和这个 User 实例将是同一个实体的一部分团体。如果这个 User 实例已经被持久化,无论是独立的还是作为另一个 Car 实例的一部分,那么这个 User 实例已经在另一个实体组中。 “拥有的”关系应该在同一个实体组中。请注意,GAE JDO 事务只能修改 1 个实体组 - 再多将引发异常。

实体组父级 - a top-level/root ("parent") persisted clas s。在上面的例子中,当你第一次持久化一个给定的 Car 实例时,你也会持久化它引用的 User 实例。 Car 实例是实体组父级。像 User 这样的“拥有的”“子”类将其父(汽车)的键嵌入到它自己的(用户)键中。如果您要从数据库中提取 Car 实例,然后尝试访问该 Car 所指的 User,那么 GAE JDO 将使用 Car 的 key 来查找相应的 User(因为目标 User 的 key 已嵌入父 Car 的 key )作为其自己 key 的一部分)。

Asker 收到此错误消息:

"Cannot have a java.lang.String primary key and be a child object"



备注 this statement in the docs :

The child class must have a key field whose type can contain the parent key information: either a Key, or a Key value encoded as a string. See Creating Data: Keys for information on key field types.



这意味着“子”类必须使用 certain types of keys (即能够将其父 key 封装在子 key 中的 key )。 LongString适用于实体组父级 类,即非子类。但是,“子”类必须使用 KeyKey encoded as String键入他们的 key 。错误消息表明 Car 类引用 User 类就好像它是“拥有的”“子”类一样,因此 User 类必须使用适合于子类的键类型,但 User 类没有使用键适合 child 的类型(非编码字符串)。

解决眼前问题的方法是将 Car 和 User 建模为 无主 通过将 Car 从对 User 的直接引用更改为通过存储相关 User 的键来间接引用来建立关系。整体修复可能包括仔细研究如何使您的对象模型适合 GAE JDO 的框架(一旦您浏览了文档以尝试理解它)。这可能包括必须手动管理类之间的某些关系。

如果有任何安慰的话,我自己也在处理与 GAE JDO 相同的问题(我什至也有一个 Car 类!)。

关于java - 无法在 GAE JDO 中持久化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2759805/

相关文章:

java - 我可以在 Java 中扩展 App Engine 标准错误 JSON 吗?

java - Google App Engine 中的自有关系不起作用

java - 使用对象 ID 进行 JDO 查询

java - 跨运行保存 Javadoc

java - Primefaces 数据表中排序不起作用

google-app-engine - GAE 的 appspot.com 缓存控制 header - HTTP STATUS 304

java - 如何使用 JDO 和 DataNucleus 在 MySQL 5.5 中设置变量?

java - 将与 USB 血糖仪设备通信的 C 代码从 Linux 迁移到 Android

java - ThreadLocal共享数据?

java - 当路径是动态时打开jsp页面