2011-01-11 5 views
2

私は2つのエンティティ、トランザクションとエントリを持っています。取引には、独自のデータと、デビットとクレジット数からなる1つまたは複数のエントリの一覧があります。アプリケーションの一部では、これらのほとんどすべてを削除する必要があり、この場合、JPQLが最も簡単で高速であることがわかりました。JPAにデータベースの変更を認識させる

私はこのコードを実行します。

entityManager.createQuery(
       "DELETE FROM Entry e WHERE e IN (:entries)"). 
       setParameter("entries", new ArrayList<Entry>(
       entriesToRemove)).executeUpdate(); 
entityManager.createQuery(
       "DELETE FROM Transaction e WHERE e IN (:transactions)"). 
       setParameter("transactions", new ArrayList<Transaction>(
       transactions)).executeUpdate(); 

問題は、後のコードであり、まだ同じトランザクション(実行トランザクションこの時間)に、私はいくつかのトランザクションに存在するすべてのエントリを通過する必要がある、EntityManagerを私はちょうど最近削除したトランザクションを私に与えます。

このイベントを処理する方法があるはずです。ここの例では、2つの削除JPQLを実行するだけですが、外部サービスなどを呼び出してデータベースに影響を与えることもできます。いずれにしても、削除されたオブジェクトがまだ残っているため、EntityManagerのキャッシュが有効であることを確認する必要があります。

私はentityManager.flush()で試行しました。これらの削除後には成功しません。私はexecuteUpdate()を使うので、削除はすぐに下位のデータベースにフラッシュされるので、私は実際にそれが助けられるとは思っていませんでした。

すべてのポインタ、ヒント、および回答を理解してください。

答えて

0

あなたはEntityManagerインターフェース

それとも、あなたはすべてのトランザクションが特定のアカウントに属していることを知っていれば、あなたはAccountオブジェクトに対してEntityManagerrefresh(Object entity)を呼び出すことができますからclear()方法を使用して、全体のキャッシュをクリアすることができます。

0

問題は、後のコードでは、 は依然として同じトランザクション (実行トランザクションこの時間)に、私は は、一部のトランザクションに存在するすべてのエントリをトラバースする必要が で、 のEntityManagerはまだ私に を与えます私が最近した取引は が削除されました。

フラッシュモード

  • AUTOデフォルトの動作です。トランザクション内で行った更新はすべてフラッシュされ、クエリでこれらの変更が反映されます。

  • COMMITは、トランザクションがコミットされたときにのみ変更がフラッシュされることを意味します。あなたがFlushModeType.COMMITを使用している場合、トランザクションに反映されている変更は、同じトランザクション内で2つのクエリを実行しているだけ&をコミットするよう

おそらく、その後、問題が発生する可能性があります。 FlushModeType.AUTOでそれはうまく動作するはずです&そのデフォルトので、それを明示的に言及する必要はありません。

問題がまだ残っている場合は、最初のクエリの後でトランザクションをコミットできます。

0

まず、一括削除ステートメントが必要ですか?つまり、あなたがそれを持っていない場合、望ましくないパフォーマンスのしきい値を越えることになります。あなたがそれを必要としない場合はsession.delete(e)を使用することができます。

質問にタグが示すように、休止状態を使用している場合は、session.evict(e)を使用してセッションからエンティティを手動で削除できます。推奨コードhereを使用して、休止状態のセッションに入ることができます。

希望に役立ちます。