2

ディスク上のファイルにバインドされたバイナリ データを保持する NHibernate マップ クラスがあります。ビジネス ロジックは非常に単純です。

  • オブジェクトがデータベースに格納されると、オブジェクト ID に一致する適切な名前のファイルに BLOB が書き込まれます。
  • オブジェクトが DB から読み込まれると、ブロブはファイルの内容で満たされます
  • オブジェクトがDBから削除されると、ファイルも削除されます

IPostDeleteEventListener を使用して 3 つの状況を処理しました

唯一の問題は、何らかの理由でSession.Delete()、ファイルが既に削除された後にトランザクションがロールバックされたが、レコードが DB に保持された場合、アプリケーションが削除されていないオブジェクトを (再) ロードしようとすると FileNotFoundException が発生することです。

また、大したことではありませんが、挿入後にトランザクションがキャンセルされると、ガベージ ファイルが生成されます。

トランザクションがコミットされているときにのみ、これらのファイル システム操作を実行するにはどうすればよいですか?

[追加] たぶん... たぶん、回避策を見つけたと言いました。インターフェイスは、インターフェイスを引数として受け入れるメソッドをITransaction公開します。RegisterSynchronization回避策になる可能性があります。トランザクションの完了後にのみファイルを保存/削除します。もっと調査する必要がありますが、NHibernate イベント リスナー サブシステムから直接コミット/ロールバックするように設計された方法はないようです。

4

1 に答える 1

1

ファイルシステムはトランザクションではなく、「ポストコミット」イベントが公開されていないため、NH のイベント システムの外側(つまり、上位層) で実行することをお勧めします。

于 2011-01-29T05:34:11.010 に答える