2

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;
4

2 に答える 2

0

データストアからオブジェクトを取得する方法や、リストにアクセスする場所については説明しません。トランザクション内?トランザクション外?オブジェクトはどのような状態ですか?中空?切り離された?所有しているオブジェクトを取得するとき、リストは現在のフェッチグループにありますか?

リストを現在のフェッチグループに入れます。

于 2012-10-29T12:53:08.973 に答える
0

エンティティ リスト メンバーをインスタンス化することは想定されていません。リストのインスタンス化は、jpa 実装の一部としてリフレクションを使用して Jo の注釈ツールで実行されます。

于 2013-05-18T08:11:59.533 に答える