Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';在GAE/JDO中持久存储内部类的正确方法是什么?_Java_Google App Engine_Jdo_Inner Classes - Fatal编程技术网

Java 什么';在GAE/JDO中持久存储内部类的正确方法是什么?

Java 什么';在GAE/JDO中持久存储内部类的正确方法是什么?,java,google-app-engine,jdo,inner-classes,Java,Google App Engine,Jdo,Inner Classes,从中,我可以读到: 实体的种类来源于类的简单名称(内部类使用$path而不使用包名) 它并没有告诉我如何存储它,这是: 下面是一个嵌入式类的示例。该示例使嵌入类成为使用它的数据类的内部类;这是有用的,但不是使类可嵌入所必需的 为什么它有用?使类“嵌入”有什么好处?如果我不需要“嵌入”它,我将如何继续我很难理解最后一句话。 假设我有一门课: @PersistenceCapable public class ChatHistory { @PrimaryKey @Persistent(

从中,我可以读到:

实体的种类来源于类的简单名称(内部类使用$path而不使用包名)

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

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

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

假设我有一门课:

@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
    }
}
@PersistenceCapable
公共课聊天历史{
@主键
@持久性(valueStrategy=IdGeneratorStrategy.IDENTITY)
私钥;
@持久的
私有数组列表消息;
//这里有更多字段和所有ChatHistory方法

私有类消息实现了{/最明显的事情是将
Message
变成一个静态类(试图持久化非静态类的想法让我头疼)并使用
@PersistenceCapable
对其进行注释。这将导致将其转换为自己的表。最好将其移动到自己的文件中(并将其更改为“package private”)相反。

Objectify—一个在GAE之上构建的方便的数据存储接口—定义了这种情况。如果您还没有寻找这种工具,这似乎是一个很好的机会。如果您需要并且更喜欢低级API,我不能再帮您了。

移动到另一个文件是我的另一个选择,但我肯定会有必须是一种将其存储为内部类的方法。我不明白在这种情况下,将其设置为静态会有什么帮助。这是一种一对多的关系,其中消息的每个实例都包含在超类的一个实例中。好的,非静态类的持久性是在JDO中存储数据的方法。如果您解释一下为什么会这样,我将不胜感激使您头痛。@Aleadam:非静态内部类通过使用隐藏字段来工作(对上下文对象的引用是
final
,对包含上下文的最终局部变量的引用也是如此)。恢复任何类都需要对其所有字段进行写入。理论上,通过字节码增强可以神奇地完成所有操作,但这一切都很混乱。为了避免混淆,请将
Message
ChatHistory
的连接显式化或删除。您需要
@PersistenceCapable
注释(或者您必须使用配置文件方法)。此外,非静态内部类没有也不可能有无参数构造函数(即使您在Java级别通常看不到这种情况)。我所看到的持久化中使用的内部类的唯一示例是静态内部类,这没有问题(在低层次上,它们只是名字有点滑稽的类)。@Donal我很感谢你的解释。我想我的问题是我不知道数据存储是如何工作的。我认为会有一个简单的解决方案,但可能不是这样,因此“嵌入式”解决方案。现在,我将把类取出,并将其作为常规类存储。稍后,我将对其进行一些阅读。正如JDO规范所述,非静态内部类不能持久化,只能持久化为静态内部类。我将检查Objectify。事实上,我只阅读了关于它的好东西。