Java で Google App Engine と JDO を使用してモバイル アプリのサーバー側を開発していますが、オブジェクト リストをデータベースに保存する際に問題が発生します。
会話とメッセージの間に 1 対多の関係があります (チャットのようなアプリケーションを実行しようとしています)。会話にはメッセージのリストがあり、メッセージは会話に属します。会話の makePersistent を実行すると、ID で同じ会話が得られれば、すべて問題なく、メッセージと共にリストが返されます。しかし、PersistenceManager のそのインスタンスを閉じて、別のメソッドで会話を取得しようとすると、null であるメッセージのリストを除いて、会話はすべて問題ありません (hour、idUser などの属性)。どんな変更を加えても、そのリストは常に null です。
これが私のコードです:
会話.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;