将关系存储为客观关键词与长ID

时间:2013-09-27 01:15:55

标签: google-app-engine rest google-cloud-datastore relationship objectify

我正在使用GAE开发RESTfull Web服务。我的技术堆栈主要围绕Jersey,Spring和Objectify。

如果你不知道Objectify是......

“Objectify是专为Google App Engine数据存储区设计的Java数据访问API。它占据了“中间地带”;比JDO或JPA更容易使用和更透明,但比低级API更方便。 Objectify旨在让新手立即高效,同时也暴露了GAE数据存储的全部功能。“

https://code.google.com/p/objectify-appengine/

截至目前,我已经使用Objectify Keys在我的模型中存储关系。像这样......

public class MyModel {

    @Id private Long id;
    private Key<MyOtherModel>> myOtherModel;
    ...

与Long ID相比,Objectify键提供额外的功能,但它们可以使用静态方法Key.create(...),Long ID和MyOtherModel.class创建,

Key.create(MyOtherModel.class, id)

因此我不必将关系存储为模型级别的Objectify键,我只是认为它更加一致。

问题是我需要编写大量额外的代码来创建XML适配器,以便在将模型对象序列化为JSON时将Objectify键转换为Long ID,并将它们从JSON反序列化为Java对象。

当我需要时,我正在考虑使用Long ID而在DAO中创建Objectify Key。此外,这将从任何不是DAO的东西中删除任何Objectify特定代码。

我想从更有经验的程序员那里获得一些观点。我从来没有创建过这么大的软件,数千行代码。

非常感谢大家。

2 个答案:

答案 0 :(得分:2)

我也是一位经验丰富的数据存储/客观化开发人员,所以我只是在这里思考。

我明白你的观点,即取代Key&lt;&gt;输入带有Long id的MyModel可以简化您的操作。我会注意到,Key&lt;&gt;对象可以包含路径(以及种类和ID)。因此,如果您的数据模型变得更复杂并且MyOtherModel不再是根类型,那么您生成密钥的能力&lt;&gt;从一个很长的身份发生故障。

如果您知道不会发生这种情况,或者不介意稍后更改MyModel,那么我想这不是问题。

对于您的序列化格式,我建议您使用String来保存您的密钥或ID。您的Long id可以转换为字符串,并且无论如何都必须为JSON(因此效率没有损失),但是稍后也可以使用相同的字符串来保存完整的Key。

答案 1 :(得分:1)

您也可以将它们存储为long(或Long或String)并具有getMyOtherModelKey()方法,并且可以在调用静态方法后返回一个键。您也可以使用getMyOtherModelID()来返回ID。这实际上有两种方式,因为如果存储密钥或只存储ID,则可以同时使用这两种方法。

如果您在任何模型中使用父母,那么诀窍就会出现。如果你单独使用ID不足以获得其他模型,则需要所有父母的ID和ID(如果需要,还需要祖父母)。这是Key很好的地方。