ディスク上のファイルにバインドされたバイナリ データを保持する NHibernate マップ クラスがあります。ビジネス ロジックは非常に単純です。
- オブジェクトがデータベースに格納されると、オブジェクト ID に一致する適切な名前のファイルに BLOB が書き込まれます。
- オブジェクトが DB から読み込まれると、ブロブはファイルの内容で満たされます
- オブジェクトがDBから削除されると、ファイルも削除されます
IPostDeleteEventListener を使用して 3 つの状況を処理しました
唯一の問題は、何らかの理由でSession.Delete()
、ファイルが既に削除された後にトランザクションがロールバックされたが、レコードが DB に保持された場合、アプリケーションが削除されていないオブジェクトを (再) ロードしようとすると FileNotFoundException が発生することです。
また、大したことではありませんが、挿入後にトランザクションがキャンセルされると、ガベージ ファイルが生成されます。
トランザクションがコミットされているときにのみ、これらのファイル システム操作を実行するにはどうすればよいですか?
[追加] たぶん... たぶん、回避策を見つけたと言いました。インターフェイスは、インターフェイスを引数として受け入れるメソッドをITransaction
公開します。RegisterSynchronization
回避策になる可能性があります。トランザクションの完了後にのみファイルを保存/削除します。もっと調査する必要がありますが、NHibernate イベント リスナー サブシステムから直接コミット/ロールバックするように設計された方法はないようです。