JDO中的持久列表(Google App Engine)

时间:2012-10-29 09:22:26

标签: java database list jdo persistent

我正在使用Google App Engine和Java中的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;

2 个答案:

答案 0 :(得分:0)

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

将列表放在当前的提取组中。

答案 1 :(得分:0)

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