web-dev-qa-db-ja.com

フラッシュモードの使用方法「自動」または「コミット」

タイトルで説明したように、アプリケーションでHibernate Autoフラッシュモードメカニズムを使用しています。そのため、Hibernate永続オブジェクトのデータを変更すると、データベースに自動的に反映されます。これは欲しくない。そこで、代わりにFlushMode Commitを使用するソリューションを見つけました。

だからここに私の実際の質問があります:

  • Commitの代わりにAutoフラッシュモードを使用する方が良いですか?そして
  • ドキュメントからのこのステートメントの意味は何ですか?

    クエリが古い状態を返さないようにするために、クエリの実行前にセッションがフラッシュされることがあります。

http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/FlushMode.html

12
commit

Hibernate(およびJPA)は、データベースへの永続オブジェクトへの変更を自動的に検出して永続化するように設計されています。 「保存」操作はありません。

保存したくない場合は、分離オブジェクトを使用する必要があります。 StatelessSessionを使用してそれらをロードするか、オブジェクトをロードした後にdetachを呼び出します。これにより、それらが監視から削除され、自動的に保存されます。

フラッシュ設定を台無しにしないでください、それは後であなたに頭痛を与えるだけです。

7
Barett

自動の代わりにコミットフラッシュモードを使用する方が良いですか

アプリケーションがクエリを使用する場合、FlushMode.COMMITは、各クエリの前にセッションをフラッシュしないため、パフォーマンスが向上する可能性があります。 javadocごとに、必要な場合にのみセッションをフラッシュする必要があることはわかっていますが、私の経験から、FlushMode.COMMITは読み取り専用セッションでさらに優れたパフォーマンスを発揮します。自動フラッシュは、永続オブジェクトへの変更がすぐにデータベースに送信されることを意味するものではありません。

ドキュメントで指定されている以下のステートメントの意味は何ですか

クエリが古い状態を返さないようにするために、クエリの実行前にセッションがフラッシュされることがあります。

上で書いたように、FlushMode.AUTO(デフォルト)を使用すると、データベースに対して行われるすべてのクエリ(HQL、Criteria、SQLクエリ)の前にセッションがフラッシュされ、現在のセッション内に追加されたすべてのエンティティが結果に含まれるようになります。

7
vitalidze