【发布时间】: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