私は JPA/OpenJPA を初めて使用しEntityManager.clear()
、エンティティを永続化した後に呼び出さないとOutOfMemoryError
(新しいエンティティをループに追加し続けます) を取得することに気付きました。これが予想される動作なのか、それとも単に OpenJPA 1.2.1 の不具合なのかはわかりません。
では、エンティティを自分で明示的にデタッチする必要がありますか? そうでない場合は、とにかく良い習慣ですか?
私は JPA/OpenJPA を初めて使用しEntityManager.clear()
、エンティティを永続化した後に呼び出さないとOutOfMemoryError
(新しいエンティティをループに追加し続けます) を取得することに気付きました。これが予想される動作なのか、それとも単に OpenJPA 1.2.1 の不具合なのかはわかりません。
では、エンティティを自分で明示的にデタッチする必要がありますか? そうでない場合は、とにかく良い習慣ですか?
JPAの経験はあまりありません。ただし、これは便利です。JPA では、次の
いずれかを行う必要があります。
- トランザクションごとに新しい EntityManager を作成します。
- 各トランザクションの後に clear() を呼び出して、永続コンテキストをクリアします。
永続化プロセス (読み取り) に取り込むオブジェクトの数によって異なります。大きな数を処理する場合 (または一部のオブジェクトが大きい場合) は、clear() の使用が理にかなっています。オブジェクトが読み取られるたびに、JPA impl によって L1 キャッシュに入れられる必要があります。
あなたのデザインのどこかに問題があるようです。通常、エンティティは、エンティティ マネージャの範囲外になると切り離されます。これが、スコープ外でリレーションを遅延ロードできない理由の 1 つです。
私の経験に関する限り、私はほとんど em.clear() を使用しませんでした。Hibernate 実装と Toplink Essentials を使用しました。OpenJPA の経験はまだありません。