2010-12-29 13 views
0

各インスタンスにバージョンタイプのオブジェクトのリスト(プロジェクトクラスとバージョンクラスの間に1対多の関係がある)が存在する、持続可能なクラスProjectがあります。GAEのJDO:クエリによって返されたオブジェクトの更新

私はそれらを変更して保存しようと、クエリでデータストアからいくつかのバージョンのオブジェクトを取得しています:

PersistenceManager pm = PMF.get().getPersistenceManager(); 
Transaction tx = pm.currentTransaction(); 
try { 
    tx.begin(); 
    Query q = pm.newQuery(Version.class, "... filters here ..."); 
    q.declareParameters(" ... parameters here ..."); 
    List<Version> versions = (List<Version>)q.execute(... parameters here ...); 
    if (versions.size() > 0) { 
     for (Version version : versions) { 
      version.setOrder(... value here ...); 
     } 
     pm.makePersistentAll(versions); 
    } 
    tx.commit(); 
    return newVersion.toVersionInfo(); 
} finally { 
    pm.close(); 
} 

すべてがエラーなしで実行され、クエリが実際のプロパティは実行時のバージョンのリストで正しく設定されている、複数のオブジェクトを返します。オブジェクトストアのプロパティはデータストア内で更新されません。オブジェクトのプロパティ)は(pm.close前に設定されているが、この行が省略された場合は何も、保存されませんので、

一般的に、私の知る限り理解し、バージョンは、さえ

pm.makePersistentAll(versions); 
を呼び出さずに保存する必要があり、同じように。

同時に、pm.getObjectById()メソッドを使用してProjectタイプのインスタンス(バージョンVersionのインスタンスを多数所有)を取得し、ループ内のすべての関連するVersionオブジェクトを処理すると、すべての変更が正しく保存されますpm.makePersistent()メソッドを呼び出すことなく)。

問題は、オブジェクトを更新するそのような方法で何が問題になりますか?なぜバージョンオブジェクトのプロパティがデータストアで更新されないのですか?

JDOやGAEのドキュメントでは役に立たないものは見つかりませんでした。ピーターロコアナハからDataNucleusのからログに関するアドバイスや同情のため

+1

おそらく、あなたがsetOrderを呼び出すポイントの周りを見ていると、あなたはよく理解できるかもしれません。 – DataNucleus

+0

あなたを助けることはできませんが、これらのタイプのデバッグが間違いなく私の髪を引き裂こうとしているように、同情を提供することができます。 –

答えて

0

感謝:)

は率直に言って、私は私の質問には、いくつかの重要なポイントを逃しました。

実は、

tx.begin(); 

Query q = pm.newQuery(Version.class, "... filters here ..."); 

の間、私はプロジェクトのインスタンスを取得していますし、バージョンインスタンスがループを更新した後、私はいくつかの1つの以上のバージョンのオブジェクトを永続化しています。

私は実際にいくつかのバージョンリストを2回取得しました。ログのコミット順に従って、Projectインスタンスも2回保存されました。 2回目のセーブ操作で最初のセーブ操作が上書きされました。

私は操作の順序を変更し、期待される動作を得ました。

+0

問題を明確にするために、コードスニペットに表示されますか? –

+0

はい。トランザクションの開始直後にpm.getObjectById()が呼び出され、トランザクションコミットの前にpm.makePersistent()がVersionインスタンスを呼び出しました。 – Kel

関連する問題