【问题标题】:What's the correct way for persistent storage of an inner class in GAE/J JDO?在 GAE/J JDO 中持久存储内部类的正确方法是什么?
【发布时间】:2011-05-02 13:25:26
【问题描述】:

来自GAE's documentation,我可以读到这个:

实体的种类派生自类的简单名称(内部类使用 $ 路径,没有包名)。

这并没有告诉我如何存储它,而这个:

这是一个嵌入式类的示例。这个例子使嵌入类成为使用它的数据类的内部类;这很有用,但不是使类可嵌入所必需的。

为什么有用?使类“嵌入”有什么好处?如果我不需要“嵌入”它,我将如何进行? 我很难理解最后这句话。

假设我有这个课程:

@PersistenceCapable
public class ChatHistory {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private ArrayList<Message> messages;
    // more fields and all the ChatHistory methods here

    private class Message implements Comparable<Message>{ // <-- This one
        public String timeStamp;
        public String text;
        // more fields and all the Message methods here
    }
}

你会如何存储它?

【问题讨论】:

    标签: java google-app-engine jdo inner-classes


    【解决方案1】:

    最明显的做法是将Message 变成一个静态类(尝试持久化非静态类的想法让我头疼)并用@PersistenceCapable 对其进行注释。这将导致它变成自己的表。最好将其移动到自己的文件中(并将其更改为“包私有”)。

    【讨论】:

    • 移动到另一个文件是我的另一个选择,但我确信必须有一种方法将其存储为内部类。我不明白在这种情况下将其设为静态会有什么帮助。这是一个一对多的关系,其中 Message 的每个实例都包含在超类的一个实例中。 AFAIK,非静态类的持久性是在 JDO 中存储数据的方式。如果你能解释一下为什么这会让你头疼,我将不胜感激。
    • @Aleadam:非静态内部类通过使用隐藏字段来工作(对上下文对象的引用是final,在包含上下文中对最终局部变量的任何引用也是如此)。恢复任何类都需要写入其所有字段。从理论上讲,无论如何都可以通过字节码增强来神奇地完成,但这一切都很混乱。避免混淆,明确从MessageChatHistory 的连接或取消它们。而且您需要 @PersistenceCapable 注释(或者您必须使用配置文件方法)。
    • 此外,非静态内部类没有也不能有无参数构造函数(即使在 Java 级别通常看不到这种情况)。我见过的关于持久化中使用的内部类的唯一示例是静态内部类,这没有问题(在低级别,它们只是名称有点滑稽的类)。
    • @Donal 感谢您的解释。我想我的问题是我真的不知道数据存储是如何工作的。我认为对此会有一个简单的解决方案,但情况可能并非如此,因此是“嵌入式”解决方案。现在,我将把课程带出去,并像普通课程一样存储。稍后,我将不得不做一些关于它的阅读。
    • 正如 JDO 规范所述,non-static 内部类不能持久化,只有 static 内部类。
    【解决方案2】:

    Objectify——建立在 GAE 之上的方便的数据存储接口——为这种情况定义了@Embedded。如果您还没有寻找这种工具,这似乎是一个很好的机会。如果您愿意并且更喜欢低级 API,我无法为您提供更多帮助。

    【讨论】:

    • 我会检查 Objectify。事实上,我只读过关于它的好东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多