1

NHibernate を ORM レイヤーとして使用して大規模なアプリケーションを構築しています。できるだけ多くのベスト プラクティスを適用しようとしましたが、その中で に設定FlushModeしましたNever。ただし、これは私たちに苦痛を与えています。たとえば、次のシナリオです。

終了日の列を持つテーブルがあります。このテーブルから、最後の (終了日までの) レコードを削除します。

  • レコードが削除されます。
  • 削除後、(終了日までに) 最後のレコードの (リポジトリ) クエリを実行します。
  • この最後のレコードは、新しいアクティブ レコードであるため更新されます。

これは非常に単純なシナリオであり、多くのシナリオが存在します。ここでの問題は、クエリを実行すると削除されたレコードが返されることですが、これはもちろん正しくありません。これは、挿入または削除されるエンティティに触れる可能性のあるビジネス ロジックでクエリを実行できないことを大まかに意味します。まだそこにないか、まだそこにいます。

このシナリオでどのように作業できますか? 設定を元に戻さずにこれを回避する方法はありますか、それとも設定をすべてFlushModeあきらめるべきですか?FlushMode

4

3 に答える 3

1

このシナリオでどのように作業できますか? FlushMode 設定を元に戻さずにこれを回避する方法はありますか

FlushMode.NeverFlush()最新のデータを処理したい場合に手動で呼び出すことを妨げません。変更せずにこのシナリオを機能させる方法だと思いますFlushMode

それとも、FlushMode の設定をすべてあきらめるべきでしょうか?

FlushMode.Never一般的なケースでの良い習慣についての参考文献を提供していただけますか? FlushMode.Never は、大部分が読み取り専用のオブジェクト セットを処理する場合に適しているようです。

http://jroller.com/tfenne/entry/hibernate_understand_flushmode_never

于 2013-09-12T11:46:44.800 に答える
1

FlushMode.Neverきめの細かい制御がどうしても必要な場合にのみ、ベスト プラクティスとして使用してください。FlushMode.Auto問題なく 99.99% のケースをカバーします。ISession.FLush()とはいえ、内部アクション キューに CUD アクションがある場合、データベース ラウンドトリップのみを含むため、CUD 操作を で修飾しても害はありません。

于 2013-09-13T11:10:36.257 に答える