我正在使用 Java 中的 Google App Engine 和 JDO 为移动应用程序开发服务器端,并且在数据库中保存对象列表时遇到了一些问题。
我在对话和消息之间有一对多的关系(我正在尝试做一个类似聊天的应用程序)。一个对话有一个消息列表,一个消息属于一个对话。当我进行对话时,如果我得到与 ID 相同的对话,一切都很好,并且列表与消息一起返回。但是,如果我关闭 PersistenceManager 的该实例并尝试以另一种方法获取对话,则对话一切正常(小时、idUser 等属性),但消息列表为空。无论我做什么更改,该列表始终为空。
这是我的代码:
对话.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;
}
}
消息.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;