タイトルで説明したように、アプリケーションでHibernate Auto
フラッシュモードメカニズムを使用しています。そのため、Hibernate永続オブジェクトのデータを変更すると、データベースに自動的に反映されます。これは欲しくない。そこで、代わりにFlushMode Commit
を使用するソリューションを見つけました。
だからここに私の実際の質問があります:
Commit
の代わりにAuto
フラッシュモードを使用する方が良いですか?そしてドキュメントからのこのステートメントの意味は何ですか?
クエリが古い状態を返さないようにするために、クエリの実行前にセッションがフラッシュされることがあります。
http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/FlushMode.html
Hibernate(およびJPA)は、データベースへの永続オブジェクトへの変更を自動的に検出して永続化するように設計されています。 「保存」操作はありません。
保存したくない場合は、分離オブジェクトを使用する必要があります。 StatelessSession
を使用してそれらをロードするか、オブジェクトをロードした後にdetachを呼び出します。これにより、それらが監視から削除され、自動的に保存されます。
フラッシュ設定を台無しにしないでください、それは後であなたに頭痛を与えるだけです。
自動の代わりにコミットフラッシュモードを使用する方が良いですか
アプリケーションがクエリを使用する場合、FlushMode.COMMIT
は、各クエリの前にセッションをフラッシュしないため、パフォーマンスが向上する可能性があります。 javadocごとに、必要な場合にのみセッションをフラッシュする必要があることはわかっていますが、私の経験から、FlushMode.COMMITは読み取り専用セッションでさらに優れたパフォーマンスを発揮します。自動フラッシュは、永続オブジェクトへの変更がすぐにデータベースに送信されることを意味するものではありません。
ドキュメントで指定されている以下のステートメントの意味は何ですか
クエリが古い状態を返さないようにするために、クエリの実行前にセッションがフラッシュされることがあります。
上で書いたように、FlushMode.AUTO(デフォルト)を使用すると、データベースに対して行われるすべてのクエリ(HQL、Criteria、SQLクエリ)の前にセッションがフラッシュされ、現在のセッション内に追加されたすべてのエンティティが結果に含まれるようになります。