1

私は 2 つのクラスを持っています。それぞれが PersistentCapable であり、Event クラスと Score クラスです。Event クラスには、スコアの ArrayList が含まれています。

イベントのリストを作成し、イベントとそれに対応するスコアをデータストアに保存しようとするメソッドがあります。

PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            pm.makePersistentAll(Event.getEvents());
        } finally {
            pm.close();
        }

イベントはすべて正常にデータストアに保存されます (/_ah/admin ですべて確認できます)。ただし、スコアは保存されません (少なくともほとんどのスコアは保存されません)。

最初のイベントのスコアはすべて保存されますが、他のイベントのスコアは保存されません。すべてのイベントにはスコアがあり、リストはデータストアに保存する前に入力されます。

私の呼び出しmakePersistentAll()も投げていますjavax.jdo.JDOUserException: One or more instances could not be made persistent

最後に、データストアの管理画面で、イベントはすべて保存されていますが、それらのスコア値は多数 (最大 15) の null 値のリストであることがわかります。他のすべての値は正しいです。キーもすべて一意です (手動で生成していますが)。

何がうまくいかないのかについてのアイデアはありますか?

イベント:

@PersistenceCapable(detachable="true")
public class Event {
    @NotPersistent
    protected static ArrayList<Event> events = new ArrayList<Event>();

    @PrimaryKey
    @Persistent
    private Key key;

    @Persistent
    private String name;
    @Persistent
    private String date;
    @Persistent
    private String year;
    @Persistent
    private String scoresUrl;
    @Persistent
    private ArrayList<Score> scores;

スコア:

@PersistenceCapable(detachable="true")
public class Score {
    @PrimaryKey
    @Persistent
    private Key key;
    @Persistent
    private Key eventKey;
    @Persistent
    private String unitName;
    @Persistent
    private int place;
    @Persistent
    private float score;

logging.properties で設定.level = FINESTした後、すべてのイベントが保存された直後に、問題を引き起こしている可能性があると思われる 3 つのエントリが表示されます。makePersistentAll()が Score オブジェクトに到達する前に、接続が閉じられているように見えます。

Aug 17, 2012 2:15:42 PM org.datanucleus.store.connection.ConnectionManagerImpl closeAllConnections
FINE: Connection found in the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@77a477b7 for key=org.datanucleus.ObjectManagerImpl@45e4d960 in factory=ConnectionFactory:nontx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@4eafccbe] but owner object closing so closing connection
Aug 17, 2012 2:15:42 PM org.datanucleus.store.connection.ConnectionManagerImpl$1 managedConnectionPostClose
FINE: Connection removed from the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@77a477b7 for key=org.datanucleus.ObjectManagerImpl@45e4d960 in factory=ConnectionFactory:nontx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@4eafccbe]
Aug 17, 2012 2:15:42 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /scores
javax.jdo.JDOUserException: One or more instances could not be made persistent
4

2 に答える 2

1

Shivan Dragon の提案に従って、私は PersistenceManager を使用することから、トランザクション内ですべてを行うことに移行しました。

(各プロパティを明示的に設定する必要があるため) 見た目はそれほど良くありませんが、期待どおりに動作し、例外をスローしなくなりました。

この方法を使用すると、個々のエンティティのデータをデータストアに保存するタイミングと保存しないタイミングをより適切に制御できるため、余分な混乱はまったく問題ありません。

于 2012-09-01T21:43:20.403 に答える