2013-08-09 6 views
10

私のタイトルが記載されているので、私のアプリケーションでは休止モードのメカニズムである休止モードのAutoを使用しています。だから、私が休止状態の永続オブジェクト内のデータを変更すると、自動的にデータベースに反映されます。私はこれを望んでいない。そこでFlushMode Commitを代わりに使用するソリューションを見つけました。何を使用するかFlush Mode 'Auto'または 'Commit'

  • Commitフラッシュモードの代わりAutoを使用することをお勧めし:だからここ

    は私の実際の質問ですか?および

  • ドキュメントからこのステートメントの意味を教えてください。

    セッションがクエリ実行前にフラッシュされることがあり、 という順序でクエリが失効状態にならないことがあります。

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

+0

リンクhttp://www.cpe.ku.ac.th/~plw/oop/e_book/hibernate_in_action.pdfを確認し、5.1.3ページをフラッシュするまでスクロールしてください。乾杯。 –

+0

あなたが探しているのは取引です。手動でセッションをフラッシュするのではなく、データベースにコミットするタイミングを定義するために、(一般的に)トランザクションを使用する必要があります。https://community.jboss.org/wiki/SessionsAndTransactions?_sscc=t –

答えて

6

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

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

フラッシュ設定を混乱させないで、後で頭痛を与えます。

+0

あなたに与える頭痛の種類を指定できますか?私たちはこれを解決策として考えており、正しい解決策ではないかどうかを知りたいと考えています。 – fool4jesus

+0

エラーが発生する書き込みがあるとします。フラッシュをさらに遅らせるということは、いくつかのクエリーが終了するまで、エラーについて見つからない可能性があることを意味します。あなたはユーザーに知らせたくないと思っています! または、読み取り専用のアプリケーションを突然変更して、ユーザーが閲覧している情報(指標、レポート、監査目的など)を追跡する必要があるとします。これで、アプリ内のすべてのクエリを再訪する必要があります。 これは、私の頭の上のほんのいくつかの例です。 – Barett

+0

ありがとう@バレット。それはまさに私たちが見つけた種類の問題です。 :-( – fool4jesus

6

それはあなたのアプリケーションがフラッシュしないのでFlushMode.COMMIT可能性が最も高いパフォーマンスが向上しますクエリを使用するとフラッシュモードの代わりに、自動

をコミット使用することをお勧めします各問合せの前にjavadocごとに、必要なときにのみセッションをフラッシュする必要があることはわかっていますが、FlushMode.COMMITは読取り専用セッションでさらに優れたパフォーマンスを発揮します。自動フラッシュは、永続オブジェクトへの変更がすぐにデータベースに送信されることを意味しません。

時々クエリが古い状態を返さないことを確実にするために、クエリの実行前にフラッシュされた文書

セッションで指定された以下の文の意味が何でありますか。私はFlushMode.AUTO(デフォルト)は、それがすべてのクエリの前にセッションをフラッシュします使用されたときに上に書いてきたように

(HQL、基準、SQLクエリ)内追加されたすべてのエンティティが含まれていると確信して結果を作るためにデータベースに対して行われました現在のセッション。

+0

参考までに読者、この回答Hibernateのドキュメントに正反対です。 https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/FlushMode。html – Barett

+3

私は最初にドキュメントを読んでからここに来ました。この答えはドキュメントの意味を明確に説明していると思います。ただし、「セッションが時折フラッシュされる...」は、すべてのクエリの前にフラッシュされるわけではありません。 「時々」の意味はここで説明されています。http://java.dzone.com/articles/dark-side-hibernate-auto-flush –

関連する問題