【问题标题】:Persistent list in JDO (Google App Engine)JDO(Google App Engine)中的持久列表
【发布时间】:2012-10-29 09:22:26
【问题描述】:

我正在使用 Java 中的 Google App Engine 和 JDO 为移动应用程序开发服务器端,但在数据库中保存对象列表时遇到了一些问题。

我在对话和消息之间建立了一对多的关系(我正在尝试做一个类似聊天的应用程序)。一个对话有一个消息列表,一个消息属于一个对话。 当我进行对话时,如果我得到与 ID 相同的对话,一切都很好,并且列表与消息一起返回。但是,如果我关闭 PersistenceManager 的该实例并尝试以另一种方法获取对话,则对话一切正常(小时、idUser 等属性),但消息列表为空。无论我做什么更改,该列表始终为空。

这是我的代码:

Conversation.java:

import java.util.LinkedList;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType = IdentityType.APPLICATION)  
public class Conversation 
{
    @PrimaryKey  
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
    private Long id;

    @Persistent
    private Long idUser;

    @Persistent(mappedBy = "conversation")
    private LinkedList<Message> messages;

    public Conversation(Long idUser) 
    {
        this.idUser = idUser;

        messages = new LinkedList<Message>();       
    }

    public Long getId() {
        return id;
    }

    public Long getIdUser() {
        return idUser;
    }

    public LinkedList<Message> getMessages() {
        return messages;
    }
}

Message.java:

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;

@PersistenceCapable(identityType = IdentityType.APPLICATION)  
public class Message 
{
    @PrimaryKey  
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
    private Key id;

    @Persistent
    private Conversation conversation;

    @Persistent
    private String text;

    @Persistent
    private String hour;

    public Message(String text, String hour)
    {
        this.text = text;
        this.hour = hour;
    }

    public String getText() 
    {
        return text;
    }

    public String getHour() 
    {
        return hour;
    }

    public Key getId() 
    {
        return id;
    }

    public Conversation getConversation() {
        return conversation;
    }
}

此外,我尝试单独获取消息并且成功获取它们。消息保存良好,但会话中的消息列表丢失。

希望有人能帮助我,在此先感谢!

编辑:我在使用此代码添加消息后保存对话:

final PersistenceManager persistenceManager = PMF.get().getPersistenceManager();      
final Conversation conversation = new Conversation(idUser1, idUser2);

//Add the messages successfully

try 
{
    persistenceManager.makePersistent(conversation);
} finally {
    persistenceManager.close();
}

我得到了和那个人的对话:

final PersistenceManager persistenceManager = PMF.get().getPersistenceManager();  
Long idConversation;

//Got the idConversation with a query successfully

Conversation conversation = persistenceManager.getObjectById(Conversation.class, idConversation);
return conversation;

【问题讨论】:

  • 建议你去stackoverflow.com/questions/13110506/…看看我在那里的回复并回答同样的问题
  • 我以前读过那篇文章,但我不知道t know what its 应该与我的问题有关。我必须阅读文章,仅此而已?
  • 另一个线程:用户有List类,用户说他坚持,用户在检索时看到列表有问题,用户没有提到正在使用的软件版本,用户没有从日志中引用它说明了对数据存储的调用。这些是您帖子的关键方面。首先回答这些问题...使用的版本、日志条目、您的检索代码是什么
  • 好的,我一直在做测试,发现了一些东西。起初,我认为我有 Datanucleus 3.1 版本,但我不确定。此外,我已经在我的数据库的管理面板中检查了这些消息保存得很好,并且对话与这些消息有关系。但是,当我从数据库中获取对话时,消息列表仍然为空,而不是返回数据库中的列表。我不明白...

标签: java database list jdo persistent


【解决方案1】:

您没有说明如何从数据存储中检索对象以及访问列表的位置。在交易中?外交易?对象处于什么状态?空洞的?分离?检索拥有对象时,List 是否在当前提取组中?

将列表放入当前提取组中。

【讨论】:

  • 对话将有一个带有消息对象键的列表的属性。这会告诉您它是否正确持久化。然后查看数据核日志以进行检索,并确保将对话列表放入 FetchPlan。
  • 抱歉,我m new in JDO, and I dont 知道 FetchPlan 是什么。对话有一个带有消息对象键的列表的属性,数据库也有键的列表,所以我不t know what Im 做错了。
  • datanucleus.org/products/accessplatform_3_1/jdo/fetchgroup.html 定义如何将字段添加到“获取组”(检索到的内容)。例如 pm.getFetchPlan().setGroup("all");所有这些都在 DN 文档和 JDO 规范中
  • 哦,我在 Google App Engine 文档中的m sorry for not reading that before but there isnt。但是,我必须对我的数据库做什么?如果所有数据都保存完好,为什么我无法正确获取数据?
  • GAE 文档说“有关 JDO 的更多信息,请参阅 Access Platform 3.0 文档”。我已经在上面告诉过你如何检索 List 字段......把它放在 fetch 计划中。 Es que la documentacion de Google es de ellos, y como has elegido usar JDO debes entender los fetch groups por que soluciona tu questiona, y esta en la documentacion de DataNucleus o la especificacion de JDO。
【解决方案2】:

您不应该实例化实体列表成员。在 Jo 的注释工具中完成列表的实例化,反射作为 jpa 实现的一部分。

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2011-12-28
    • 2011-06-19
    • 2013-05-02
    相关资源
    最近更新 更多