Java 无法在GAE JDO中持久化对象
我对JDO和GAE都很熟悉,一直在努力让我的数据层持久化任何代码 我面临的问题可能很简单,但无论我尝试什么解决方案,我似乎都找不到任何办法 首先是问题:(稍微简化,但仍然包含所有必要的信息) 我的数据模型如下所示:Java 无法在GAE JDO中持久化对象,java,google-app-engine,jdo,Java,Google App Engine,Jdo,我对JDO和GAE都很熟悉,一直在努力让我的数据层持久化任何代码 我面临的问题可能很简单,但无论我尝试什么解决方案,我似乎都找不到任何办法 首先是问题:(稍微简化,但仍然包含所有必要的信息) 我的数据模型如下所示: User: (primary key) String emailID String firstName Car: (primary key) User user (primary key) String registratio
User:
(primary key)
String emailID
String firstName
Car:
(primary key)
User user
(primary key)
String registration
String model
这是最初的数据模型。我实现了一个CarPK对象来获取用户和注册的复合主键。然而,这遇到了各种各样的问题。(我将留作下次提问)
然后我更改了设计,如下所示:
用户:(未更改)
这对用户来说很好,它可以插入和检索用户对象。但是,当我尝试插入汽车对象时,会出现以下错误:
"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
转到此处建议的链接,该链接解释了如何创建键,但他们一直在谈论“实体组”和“实体组父级”。但我似乎找不到任何文章或网站解释什么是“实体组”或“实体组家长”
我可以试着再摆弄一些来弄清楚我是否能够以某种方式存储一个对象,但我需要耐心,而且我更愿意理解和实现,而不是相反
因此,我非常感谢任何涵盖所有这些要点的文档(即使是巨大的文档),最好有一些超越基本数据建模的示例
感谢您阅读这么长的帖子:)请阅读恐怕您不会喜欢这个答案。GAE JDO必须以一种非常具体的方式使用,并且要有效地使用它,您必须遵守很多限制。前后阅读文档。对于您现在看到的问题,您可能需要多次阅读本节: GAE JDO拥有和未拥有的关系。有关自有与非自有的示例,请参见上述文档。我相信您希望
Car
和User
拥有无主关系。请注意Google App Engine文档中关于无主关系的披露:
除了拥有的关系之外,JDOAPI还提供了一种管理无主关系的工具。JDO的App Engine实现尚未实现此功能,但别担心,您仍然可以使用键值代替模型对象的实例(或实例集合)来管理这些关系
这本质上意味着,要使用GAE JDO,您不应该对无主关系(如Car和用户类之间)使用直接引用。相反,您应该在它们之间使用间接引用,即Car应该为用户的密钥设置一个字段,而不是直接引用用户本身。您遇到的一些麻烦是因为GAE JDO无法处理如何在代码中建模这种关系
Asker接着说:
转到此处建议的链接,该链接解释了如何创建键,但他们一直在谈论“实体组”和“实体组父级”。但我似乎找不到任何文章或网站解释什么是“实体组”或“实体组家长”
实体组-。例如,因为Car直接引用一个用户,当您第一次持久化给定的Car实例时,您还将持久化它所引用的用户实例,并且此Car实例和此用户实例将是同一实体组的一部分。如果此用户实例已被持久化(单独或作为另一个Car实例的一部分),则此用户实例已在另一个实体组中。“拥有”关系应位于同一实体组中。请注意,GAE JDO事务只能修改1个实体组-任何修改都会引发异常
实体集团母公司-s。在上面的示例中,当您第一次持久化给定的Car实例时,您还将持久化它所引用的用户实例。Car实例是实体组父对象。一个“拥有的”类“子类”用户将其父类(汽车)的密钥嵌入到自己的(用户)密钥中。如果要从数据库中提取一个Car实例,然后尝试访问该Car引用的用户,那么GAE JDO将使用该Car的密钥查找相应的用户(因为目标用户的密钥将父级Car的密钥作为其自身密钥的一部分嵌入)
Asker收到以下错误消息:
“不能具有java.lang.String主键且不能是子对象”
注:
子类必须有一个键字段,其类型可以包含父键信息:键或编码为字符串的键值。有关键字段类型的信息,请参见创建数据:键
这意味着“子”类必须使用(即能够在子密钥中封装其父密钥的密钥)<代码>长和字符串
适用于实体组父类类,即非子类。但是,“child”类的键必须使用Key
或Key编码为String
类型。错误消息表明,Car类引用用户类时,将其视为“拥有的”“子”类,因此用户类必须使用适合于子类的密钥类型,但用户类未使用适合于子类的密钥类型(非编码字符串)
解决眼前问题的方法是通过存储相关用户的钥匙,将汽车从直接引用用户更改为间接引用,从而将汽车和用户的关系建模为无主关系。总的解决方案可能包括仔细研究如何将您的对象模型适合GAE JDO的框架(一旦您仔细阅读文档试图理解它)。这可能包括必须手动管理类之间的一些关系
如果有的话
"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