26

クラス構造、HBM、およびNHとのすべての関係に対する各カスケード設定でのアクションの影響の例を含む、NHibernateのすべてのカスケード設定への決定的なガイドを備えたインターネットリソースはありますか。

また、状態テーブルを設定して状態をカスケード削除したり、CreatedBy Userプロパティを持つオブジェクトを削除したりするなど、一般的な関連付けを最も正確に行う例があると便利です。カスケードなどでユーザーを削除してしまうことはありません。

4

4 に答える 4

60

以下は、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と同じです。

推奨事項:

  • 通常、<多対1>または<多対多>の関連付けでカスケードを有効にすることは意味がありません。カスケードは、多くの場合、<1対1>および<1対多>の関連付けに役立ちます。
  • 子オブジェクトの寿命が親オブジェクトの寿命によって制限されている場合は、cascade = "all-delete-orphan"を指定して、子オブジェクトをライフサイクルオブジェクトにします。
  • そうしないと、カスケードがまったく必要ない場合があります。ただし、同じトランザクションで親と子を一緒に操作することが多く、入力を節約したい場合は、cascade = "persist、merge、save-update"の使用を検討してください。

関連付け(単一値の関連付けまたはコレクションのいずれか)をcascade = "all"でマッピングすると、関連付けが親/子スタイルの関係としてマークされ、親の保存/更新/削除によって子の保存/更新/削除が行われます。子供。親によって参照されなくなった子は、cascade = "delete-orphan"でマップされた<1対多>の関連付けの場合を除いて、自動的に削除されません。親子関係のカスケード操作の正確なセマンティクスは次のとおりです。

  • 親がPersist()に渡されると、すべての子がPersist()に渡されます。
  • 親がMerge()に渡されると、すべての子がMerge()に渡されます。
  • 親がSave()、Update()、またはSaveOrUpdate()に渡されると、すべての子がSaveOrUpdate()に渡されます。
  • 一時的または切り離された子が永続的な親によって参照されるようになると、それはSaveOrUpdate()に渡されます。
  • 親が削除されると、すべての子がDelete()に渡されます
  • 子が永続的な親によって逆参照された場合、特別なことは何も起こりません。必要に応じて、アプリケーションは子を明示的に削除する必要があります。cascade= "delete-orphan"の場合は、「孤立した」子が削除されます。
于 2010-02-11T00:42:12.057 に答える
4

受け入れられた回答は、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関連付けの所有者を指定します。詳細については、この質問とこの回答を参照してください。

于 2019-07-24T10:01:32.037 に答える
3

これは明らかなアドバイスかもしれませんが、Ayendeによる古い投稿を閲覧することをお勧めします。彼のサイトでNHibernateとcascadeをすばやく検索すると、いくつかの興味深い投稿が見つかりました。ただし、ニーズに対しては少し不足している可能性があります。

それ自体はインターネットリソースではありませんが、NHibernateinActionもお勧めします。これは、第3章、第4章、および第6章でカスケードについてある程度詳しく説明しています。この本はNHibernate1.2を対象としています。ただし、NHibernateの3.0リリースを対象とした本の新版があると私は信じています。注目する価値があるかもしれません。

カスケードの決定的なガイドを見たかったのと同じくらい、私は見たことがありません。たぶん、あなたはあなた自身のブログのあなた自身の投稿とカスケードを議論しているそこにあるブログ投稿のいくつかを要約することができます。

于 2010-02-07T10:15:25.453 に答える
3

「決定的な」ガイドはわかりませんが、私が知っている最高のリソースは、NHibernateの決定的な教祖の1人であるAyendeからのブログ投稿です。

NHibernateカスケード:all-delete-orphansとsave-updateの違い

私の場合、実際にはとのみを使用cascade="none"cascade="all"ます。all-delete-orphan時々オプションです。他のすべては疑わしいです。たとえば、インスタンスが含まれているオブジェクトよりも長持ちする場合、インスタンスが参照されているため、インスタンスを暗黙的に作成する必要があるのはなぜですか?私の場合、状況は2つだけです。オブジェクトが依存している場合と独立している場合です。

于 2010-02-09T13:32:57.093 に答える