2

我正在使用 GAE 开发一个 RESTfull 网络服务。我的技术栈主要集中在 Jersey、Spring 和 Objectify。

如果您不知道 Objectify 是...

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

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

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

public class MyModel {

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

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

Key.create(MyOtherModel.class, id)

所以我不必在模型级别将关系存储为 Objectify 键,我只是认为它更一致。

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

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

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

非常感谢大家。

4

2 回答 2

2

我也是一个经验不足的数据存储/对象化开发人员,所以我只是在这里沉思。

我明白你的意思,用 Long id 替换 MyModel 中的 Key<> 类型会为你简化事情。不过我会注意到, Key<> 对象可以包含路径(以及种类和 id)。因此,如果您的数据模型变得更加复杂并且 MyOtherModel 不再是根类型,那么您从 Long id 生成 Key<> 的能力就会失效。

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

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

于 2013-09-27T16:00:26.327 回答
1

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

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

于 2013-11-12T14:48:40.173 回答