web-dev-qa-db-ja.com

Hibernate:変更を保存しながら永続オブジェクトをevict()

session.save(object)を使用して取得した永続的な休止状態オブジェクトがあります。

それから変更しました。

オブジェクトの処理が完了したら、session.evict(object)を実行してメモリを節約します。

evict()here のドキュメントには、オブジェクトへの変更が永続化されないことが記載されています。言い換えれば、エビクトにより、オブジェクトに対して行った変更が失われます。

session.flush()を呼び出すこともできますが、すべての変更がフラッシュされます。

退出前に単一の永続オブジェクトに加えられた変更を永続化するにはどうすればよいですか?

16
Roman Zenka

session.save(object)またはsession.saveOrUpdate(object)を呼び出すと、必要に応じてevictを呼び出すことができます。ただし、これを行う前にセッションをフラッシュする必要があります。セッションは、正当な理由により、作業単位ベースのインターフェイスになるように設計されています。トランザクションセマンティクスは、この機能がなければ災害になります。同じセッションの一部である他のエンティティをフラッシュせずに個々のエンティティをフラッシュする必要がある場合は、作業単位を再考する必要があります。

18
jonathan.cone

session.evict(obj)を実行すると、オブジェクトインスタンスがセッションキャッシュから削除されます。したがって、オブジェクトを初めて保存する場合、オブジェクトをキャッシュから削除する前に、session.save(obj)を介して明示的にコミットする必要があります。後続の更新呼び出しでは、session.saveOrUpdate(obj)またはsession.update(obj)を実行してから、evictを呼び出して、ロードされたオブジェクトをキャッシュから削除する必要があります。

そうすることは、オブジェクトのインスタンスをキャッシュに戻す必要があるときに、session.load(obj)またはsession.get(obj)を明示的に呼び出す必要があることを意味します。

4
Bitmap