2009-06-17 4 views
3

拡張永続コンテキストを使用しています。これは、オブジェクトに1対多の関係をゆっくりとロードすることができ、SELECTを必要としないためです。永続コンテキストを持つオブジェクト。JPA/Hibernateクエリが古い結果を返す

私はとDummyObject持っている:

  1. A "最終更新日" の日付フィールドを

  2. このオブジェクトはすべての更新されている

1対多リレーションシップ秒を1つのJVMでem.merge(DummyObject)呼び出しで取得します。別のJVMで

は、私はまた、このクエリごと秒をやって、次の

em.createQuery("from DummyObject").getResultList(); 

のような呼び出しを行うDummyObjectを問い合わせます。

問題は、Hibernateが正しいSQL文(私は文がログオンしているとき)を生成しているにもかかわらず、連続した呼び出しの後に最初のQueryのタイムスタンプを持つことです。アップデートを正しく取得しています(私は確認済みです)。

@Versionを使用してあらゆる種類のオプティミスティックロックを無駄にしようとしました。

  1. は私が(TRANSACTIONALに は私を遅延 ONE-多くをロードすることはできません何かをPersistentContextType を変更:もう一つのとき、これは正常に動作しないことです

    (コメントを参照してください)関係)

  2. 上記のクエリを実行する前に、私はEntityManager.clear()コール を実行します。 (これもまた ONE-MANY 関係を遅延ロードする)。

なぜ陳腐化したデータが返されますか?私はがありません。第2レベルのキャッシュまたはクエリキャッシュが有効になっています。

何か間違っていますか? query.setHint(、)で設定できるものはありますか?

たぶん私は正しくTRANSACTIONAL対 "をEXTENDED" 理解していません。

+1

は、最終更新版としてマップされていますか? – Surya

+0

ちょうどそれを試みました。働かなかった。私は明示的な "バージョン"フィールドを追加し、@ Versionで注釈を付けることも試みました。また、動作しませんでした。 – systemoutprintln

+0

はlastUpdatedを見ていると等しいとハッシュコードですか? em.createQuery()の結果に属していない追加のオブジェクトが表示されていますか? – zmf

答えて

0

フェッチ前にflush()を実行しようとしましたか?

+0

ちょうどそれを試みた...うまくいきませんでした。しかし、ありがとう。 – systemoutprintln

+0

毎回オブジェクトを再フェッチするのか、遅延読み込み参照を使用していますか?私は、新しいデータが現れる前にオブジェクトを再度フェッチする必要があった問題がありました。 – Jesse

+0

あなたが何を意味するのか分かりません。私は上記のクエリを5秒ごとに実行しており、そのクエリから得られる結果は古くなっています。これは、実際の実装よりも "テスト"のケースです。基本的には私の問題は、EXTENDEDコンテキストタイプを使用し、関係を遅延ロードできるようにしたいということです。しかし、うまくいかないのは、クエリが常に古い結果を返すということです。 – systemoutprintln

0

興味深い。私にとっては、永続コンテキストのエンティティインスタンスがクエリの結果で更新されていないようです。これは意図的なものかもしれません。誤ってクエリを実行してローカルの変更を上書きする可能性があります。さらに悪い何

は、単一のインスタンスを剥離するJPAでの方法がないということです。コンテキスト全体をクリアするか、そうでないかのどちらかです。だから、それは可能な解決策でもありません。

PersistanceContextクラスで利用可能なrefresh()メソッドがあります。このメソッドは、データベースから変更を取得し、それに応じてエンティティインスタンスを更新します。しかし、実際の実装ではそれがどのように適用されないのか分かります。だから私の答えは次のようになっています。おそらくそれを働かせることはできません。

+0

ええ、返された結果セットを反復して調べ、各オブジェクトで「リフレッシュ」を実行しましたが、大きな結果セットではばかげています。 – systemoutprintln

+0

リストの内容は同じままです(つまり、新しいオブジェクトを取得しないか、古いオブジェクトを削除しますか)。 –

+0

リスト内の各オブジェクトに対してrefresh()を実行しないと、リストの内容は同じになります。 – systemoutprintln

1

hibernateセッションが永続オブジェクトをキャッシュしています。したがって、あるJVM(A)で変更していて別のJVM(B)で読み込んでいるため、Bのセッションをリフレッシュして変更を確認する必要があります。新しいセッションを開くことも、永続オブジェクトを追い出し/更新することもできます。また、両方のJVMでセッションを複製して、問題を処理することもできます。または、必要な「DummyObject」の部分だけを返すようにクエリを変更し、必要に応じて永続オブジェクトを読み取るようにしてください。また、ステートレスセッションを試すこともできます。

関連する問題