クラス構造、HBM、およびNHとのすべての関係に対する各カスケード設定でのアクションの影響の例を含む、NHibernateのすべてのカスケード設定への決定的なガイドを備えたインターネットリソースはありますか。
また、状態テーブルを設定して状態をカスケード削除したり、CreatedBy Userプロパティを持つオブジェクトを削除したりするなど、一般的な関連付けを最も正確に行う例があると便利です。カスケードなどでユーザーを削除してしまうことはありません。
クラス構造、HBM、およびNHとのすべての関係に対する各カスケード設定でのアクションの影響の例を含む、NHibernateのすべてのカスケード設定への決定的なガイドを備えたインターネットリソースはありますか。
また、状態テーブルを設定して状態をカスケード削除したり、CreatedBy Userプロパティを持つオブジェクトを削除したりするなど、一般的な関連付けを最も正確に行う例があると便利です。カスケードなどでユーザーを削除してしまうことはありません。
以下は、JavaHibernateリファレンスhttp://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitivefor NHiberate 3.0(つまり現在のsvnトランク)からの抜粋です。 。
NHibernateセッションの基本操作(Persist()、Merge()、SaveOrUpdate()、Delete()、Lock()、Refresh()、Evict()、Replicate()など)ごとに、対応するカスケードスタイルがあります。それぞれ、カスケードスタイルには、persist、merge、save-update、delete、lock、refresh、evict、replicateという名前が付けられています。Save()とUpdate()のカスケードスタイルはsave-updateです。SaveAndUpdateCopy()の場合はマージです。PersistOnFlush()の場合、それは永続的です。そして、removeはdeleteのエイリアスです。
操作を関連付けに沿ってカスケードする場合は、マッピングドキュメントでそのことを示す必要があります。例えば:
<one-to-one name="person" cascade="persist"/>
カスケードスタイルを組み合わせることができます:
<one-to-one name="person" cascade="persist,delete,lock"/>
cascade = "all"を使用して、すべての操作を関連付けに沿ってカスケードするように指定できます。デフォルトのcascade="none"は、カスケードされる操作がないことを指定します。
特別なカスケードスタイルであるdelete-orphanは、1対多のアソシエーションにのみ適用され、アソシエーションから削除されるすべての子オブジェクトにDelete()操作を適用する必要があることを示します。そして、all-delete-orphanはall、delete-orphanと同じです。
推奨事項:
関連付け(単一値の関連付けまたはコレクションのいずれか)をcascade = "all"でマッピングすると、関連付けが親/子スタイルの関係としてマークされ、親の保存/更新/削除によって子の保存/更新/削除が行われます。子供。親によって参照されなくなった子は、cascade = "delete-orphan"でマップされた<1対多>の関連付けの場合を除いて、自動的に削除されません。親子関係のカスケード操作の正確なセマンティクスは次のとおりです。
受け入れられた回答は、HBMファイルでこれを詳細に説明しています。この回答は、コードによるマッピングでも同じことをカバーしています。それらはほとんど同じです。HBM文字列にマップされただけです。
Ayendeの記事フォームはそれをよく説明しています:
- none-カスケードを実行せず、ユーザーが自分でカスケードを処理できるようにします。
- save-update-オブジェクトが保存/更新されたら、関連付けを確認し、それを必要とするオブジェクトを保存/更新します(多対多のシナリオでの関連付けの保存/更新を含む)。
- 削除-オブジェクトが削除されたら、関連付け内のすべてのオブジェクトを削除します。
- delete-orphan-オブジェクトが削除されたら、関連付け内のすべてのオブジェクトを削除します。それに加えて、オブジェクトが関連付けから削除され、別のオブジェクトに関連付けられていない(孤立している)場合は、そのオブジェクトも削除します。
- all-オブジェクトが保存/更新/削除されている場合、関連付けを確認し、見つかったすべてのオブジェクトを保存/更新/削除します。
- all-delete-orphan-オブジェクトが保存/更新/削除されている場合、関連付けを確認し、見つかったすべてのオブジェクトを保存/更新/削除します。さらに、オブジェクトが関連付けから削除され、別のオブジェクトに関連付けられていない(孤立している)場合は、そのオブジェクトも削除します。
また、この質問は、のいくつかの内部実装を説明していCascade
ます。
[Flags] public enum Cascade { None = 0, Persist = 2, Refresh = 4, Merge = 8, Remove = 16, Detach = 32, ReAttach = 64, DeleteOrphans = 128, All = 256, } private static IEnumerable<string> CascadeDefinitions(this Cascade source) { if (source.Has(Cascade.All)) { yield return "all"; } if (source.Has(Cascade.Persist)) { yield return "save-update, persist"; } if (source.Has(Cascade.Refresh)) { yield return "refresh"; } if (source.Has(Cascade.Merge)) { yield return "merge"; } if (source.Has(Cascade.Remove)) { yield return "delete"; } if (source.Has(Cascade.Detach)) { yield return "evict"; } if (source.Has(Cascade.ReAttach)) { yield return "lock"; } if (source.Has(Cascade.DeleteOrphans)) { yield return "delete-orphan"; } }
Cascade.All
は含まれていませんのでご注意くださいCascade.DeleteOrphans
。その場合、を使用して含める必要がある場合がありますCascade.All | Cascade.DeleteOrphans
。
Include
または、拡張メソッドを使用することもできますCascade.All.Include(Cascade.DeleteOrphans)
。
と組み合わせて、同様Cascade
に調べる必要があるかもしれません。Inverse
関連付けの所有者を指定します。詳細については、この質問とこの回答を参照してください。
これは明らかなアドバイスかもしれませんが、Ayendeによる古い投稿を閲覧することをお勧めします。彼のサイトでNHibernateとcascadeをすばやく検索すると、いくつかの興味深い投稿が見つかりました。ただし、ニーズに対しては少し不足している可能性があります。
それ自体はインターネットリソースではありませんが、NHibernateinActionもお勧めします。これは、第3章、第4章、および第6章でカスケードについてある程度詳しく説明しています。この本はNHibernate1.2を対象としています。ただし、NHibernateの3.0リリースを対象とした本の新版があると私は信じています。注目する価値があるかもしれません。
カスケードの決定的なガイドを見たかったのと同じくらい、私は見たことがありません。たぶん、あなたはあなた自身のブログのあなた自身の投稿とカスケードを議論しているそこにあるブログ投稿のいくつかを要約することができます。
「決定的な」ガイドはわかりませんが、私が知っている最高のリソースは、NHibernateの決定的な教祖の1人であるAyendeからのブログ投稿です。
NHibernateカスケード:all-delete-orphansとsave-updateの違い
私の場合、実際にはとのみを使用cascade="none"
しcascade="all"
ます。all-delete-orphan
時々オプションです。他のすべては疑わしいです。たとえば、インスタンスが含まれているオブジェクトよりも長持ちする場合、インスタンスが参照されているため、インスタンスを暗黙的に作成する必要があるのはなぜですか?私の場合、状況は2つだけです。オブジェクトが依存している場合と独立している場合です。