問題タブ [nhibernate-cascade]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
hibernate - カスケード削除を使用する場合、Hibernateでオプションの関係をどのように処理しますか?
これが明らかな場合は申し訳ありませんが、私たちはこれについて数日間頭を悩ませてきました。
親、子、Xの3つのエンティティについて考えてみます。
親は子と@OneToManyの関係を持ち、カスケード削除と孤立した削除=trueに設定されています。
子には親との@ManyToOne関係があり、オプション= falseです。さらに、関係は@NotNullであり、@JoinColumnにはnullable=falseがあります。
Xには、オプション=trueの子と@ManyToOneの関係があります。
親を削除したときに理想的に発生したいことは次のとおりです。削除をカスケードして、削除された親に対応するすべての子行を削除します。今のところ問題ありません。ただし、削除された子を参照するXには、子の関係を無効にする必要もあります。Xを削除するのではなく、関係を無効にするだけです。これは、「オプション」の関係であることと一致しています。
Hibernateでこれをどのように行うのですか?理想的には、これらの関係を無効にするためにビジネスロジックを「覚えておく」必要がないように、宣言型にする必要があります。実際、カスケードを使用する場合は、オプションの関係が無効になる前にカスケードのレベルが多くなる可能性があることを考えると、実際には宣言型である必要があります。
ヒントはありますか?私たちは困惑しています...。
join - オプションの逆結合のカスケード削除
エンティティ クラスの 1 つに対する次の簡略化されたマッピングがあります。
基本的には、関係の反対側からの外部キーと 1 対 1 です (そのため、「逆」を設定します)。また、Parent は tOneToOneComponent にレコードを持たない場合があります (したがって、optional="true" になります)。
このような結合はお勧めできませんが、少し古くて大規模なシステムがあり、再設計する時間がありません。
Parent が削除されたときに、NHibernate が関連する tOneToOneComponent を削除するようにします。
もちろん、SQL サーバーで削除操作をカスケードすることもできますが、tOneToOneComponent がキャッシュ内のどこかに留まらないように、NHibernate キャッシュをクリアする必要があります。
そのため、on-delete="cascade" を追加しましたが、親を削除すると、SQL は次のように言います。
NHibernate が間違った順序でレコードを削除しようとしているようです。
最初に tOneToOneComponent を削除し (存在する場合)、次に親を削除するように NHibernate に指示する方法は?
nhibernate - HasMany Relationship with Integrity 制約で Composite ID を使用した Fluent NHibernate でのカスケード削除
エラーが発生しました。どれだけ Google で検索しても、修正方法が見つかりません。次のトピックを読んで解決しようとしました。これらは私の問題に関連して私が見つけた最も近いものです:
- Fluent NHibernate とコレクションのマッピング
- NHibernate で CompositeId を使用して保存をカスケードする方法は?
- オブジェクト化された多対多の関係をマッピングする方法は?
DB スキーマ
Member
このマッピングには、 、Vehicle
、MemberVehicles
およびの 4 つのテーブルが含まれLastUsedVehicles
ます。
- テーブル
Member
とVehicle
は、アプリケーション内のビジネス オブジェクトです。 - テーブルは、余分な列のない
MemberVehicles
関連付けテーブル ( ) です。many-to-many
この関係は問題なく機能します。 - テーブルにはとで
LastUsedVehicles
構成される複合キーが あり、これらは対応するテーブルへの外部キーです。テーブルには、タイムスタンプを格納する追加の列もあります。 このテーブルのマッピングは私の問題です。Vehicle_uid
Member_uid
DateLastUsed
問題
を削除するときMember
、彼Vehicle
の もすべて削除する必要があります (これは正常に機能します - レコードは多対多テーブルから削除されます)、関連するすべてのLastUsedVehicles
レコード (これは削除されない部分です)仕事)。
このコードを実行すると...
... 次のエラーが表示されます。
System.Exception : UnitOfWork 中にコミットしようとして失敗しました。次のエラーのため、トランザクションがロールバックされました: 指定されたキーがディクショナリに存在しませんでした。----> System.Collections.Generic.KeyNotFoundException : 指定されたキーがディクショナリに存在しませんでした。
LastUsedVehicles
テーブルが空の場合、エラーは発生しません。
マッピング
メンバー
車両
最後に使用した車両
クラス
メンバー
車両
最後に使用した車両
デバッグ情報
わかりやすくするために、いくつかの SQL クエリとその結果も添付しています。
テーブルLASTUSED_VEHICLES
が空になったら、メンバーを削除できます。
投稿が長くなって申し訳ありませんが、このシナリオは非常にユニークなようです。注目してくれてありがとう。
nhibernate - コレクションをクリアするときに子供にNHibernateカスケード削除
たくさんの場所を検索しましたが、探している答えが見つかりません。
NHibernate3.2を使用しています-コードによるマッピング
私は次のマッピングファイルを持っています:
カスケード保存は正常に機能します。
電話をかけようとすると:
エンティティは親に関連付けられたままです。
私はそれを呼び出すことによって機能させました:
親を救う方法があるのではないかと期待していましたか?
乾杯、
ジェームズ
nhibernate - NHibernateはカスケード削除を防止します
クラスFooがあるとします。また、Foo_Fooと呼ばれるFooについての見解があり、Foos間の多対多の関連付けがリストされています。この関連付けを、cascade = "none"を使用して、各Fooの単純な不変セットとしてマッピングしました。
ただし、Fooを削除しようとすると、NHibernateはFoo.associationの削除を試みて失敗します。
NHibernateがビューへの関連付けを削除しようとするのを防ぐにはどうすればよいですか?
nhibernate - 多対多:一方の側を削除します。関係エントリは、もう一方の側は削除しないでください。
多くのユーザーグループを持つユーザーを削除したいのですが、それらのユーザーグループはこのユーザー専用ではありません。他のユーザーもこのユーザーグループを使用できます。また、ユーザーグループは、参照するユーザーがいない場合でも存在できます。
多対多の関係をマッピングして、ユーザーが削除された場合、関係は自動的に削除されますが、ユーザーグループは削除されないようにしたいですか?
Cascade.All
多対多のカスケードは関係に影響を与えますが、反対側には影響を与えないと思ったので、試しました。Cascade.AllDeleteOrphan
反対側の削除しかできないと思いました。明らかに私は間違っています。
カスケードルールがよくわからないようです。誰かが私に明確な説明を提供し、おそらく私の目標を達成する方法も提供できますか?
ありがとう
c# - NHibernateがあります-カスケード削除を伴う多くのコレクションが失敗しています
目的:
親の子のリストへの変更がすべての子に伝播し、NHibernateに手間のかかる作業を行わせるように、親子関係を作成します。親子関係はHas-Many
、自己参照テーブル上にあります。
問題:
親(ルート)オブジェクトを削除しようとすると、子オブジェクトを削除するという期待される動作ではなく、例外が発生します。
私が使用しているもののバージョン:
Microsoft SQL
ServerManagementStudioバージョン10.0.4064.0FluentNHibernate
バージョン1.3NHibernateバージョン3.2.0.4
以下は、この動作を複製するために使用している現在のクラスオブジェクトとテーブル構造のセットです。
上記のテーブルとクラスを使用して、カスケードをこれらのオプションに変更し、テストの分解中に指定されたものを実行すると、これらが結果になります。
Cascade.AllDeleteOrphan
の場合:親オブジェクトでdeleteを呼び出すだけで、次の例外が発生します。
それぞれの子を繰り返し処理した後、それらの子の子を再帰的に掘り下げ、各子を下から上に削除しようとします。
子を繰り返し処理し、子の各セットをクリアしてから、親を保存/削除した後、次の例外が発生します。
Cascade.Allを使用すると、親オブジェクトでdeleteを呼び出すだけで、次の例外が発生します
。Cascade.AllDeleteOrphanの場合と同じです。
各子を繰り返し処理した後、それらの子の子を再帰的に掘り下げ、各子を下から上に削除しようとします
。Cascade.AllDeleteOrphanの場合と同じです。
子を繰り返し処理し、子の各セットをクリアしてから、親を保存/削除すると、次
の例外が発生します。例外なし:親は正しく削除されますが、不要な孤立したオブジェクトがあります。
私は多くのブログ/stackoverflowの質問/リソースドキュメントを調べましたが、この問題の解決策は実際には見ていません。
これが私がすでに掘り下げたリンクのいくつかです:
- FluentNHibernateを使用して参照オブジェクトを削除する方法(古い「削除されたオブジェクトはカスケードによって再保存されます」)
- カスケードのエラー:削除されたオブジェクトはカスケードによって再保存されます
- オートマッパーを使用したカスケード削除によるFluentNHibernateの1対多のセットアップ
- key-many-to-oneおよびkey-propertyの関連付け:nhibernateはセットからアイテムを削除しません
- https://nhibernate.jira.com/browse/NH-1050
(ヌルのFKがあることに注意してください) - 行が別のトランザクションによって更新または削除された(または未保存の値のマッピングが正しくなかった)
(タイムスタンプの楽観的なバージョン管理を使用していることに注意してください) - https://forum.hibernate.org/viewtopic.php?t=933496(cascade=
allに関するernst_pluessによるコメントは、HiLoの使用に関する警告フラグをスローしましたが、HiLoは生成または割り当てられていますか?技術的にはNHibernateが生成してから割り当てます。 。) - NHibernateでの子レコードの削除の例外
(すべての子オブジェクトを手動で削除する必要があるように見えます。これにより、カスケードの目的が失われます!!)
投稿の多くは関係を逆転させることに言及していますが、.inverseを設定し、子供に関係を所有させることは、ここでの目標ではありません!
何が欠けているのかわかりませんが、うまくいけば、これは私が見落としている修正が本当に簡単なものです。どんな助けでも大歓迎です!
c# - Nhibernateマッピング、カスケード、逆、更新、挿入?
従業員が獲得した計算されたボーナスとポイントを保存するEmployeeMonthオブジェクトがあります。EmployeeMonthオブジェクトには、BonusMonthオブジェクトがあります。BonusMonthオブジェクトは、ボーナスを獲得するために従業員が毎月到達しなければならない間隔を設定します(このオブジェクトは毎月設定され、変更しないでください)。
たとえば88%の削減でボーナスを再計算する場合、BonusMonthオブジェクトの間隔を調整してから、ボーナスを再計算します。新しいボーナス(結果)は、同じEmployeeMonthオブジェクトに保存されます。
次に、新しいEmployeeMonthを保存すると、BonusMonthも同様に保存されます。
BonusMonthが保存されないようにnhibernateマッピングを構成するにはどうすればよいですか?再計算されたEmployeeMonth値のみを更新/保存したい。
これは私のマッピングがどのように見えるかです:
EmployeeMonth.cs
BonusMonth.cs
EmployeeMonth.hbm.xml
BonusMonth.hbm.xml
nhibernate - カスケード SaveUpdate が Delete ステートメントをトリガーするのはなぜですか?
これは、私が以前に尋ねたこの質問に関連しています。
マッピングでは期限Request
に設定し、マッピングではカスケードをなしに設定しています。SaveUpdate
Discount
次の 2 つのシナリオがあります。
1 つ目は、新規リクエストと新規ディスカウントです。両方を作成し、割引をリクエストに追加してリクエストを保存しました。これは期待どおりに機能します。
次のシナリオは、新しいリクエストと既存の割引です。これは正しく機能していません。その理由はわかりません。以下は、テストで実行された SQL ステートメントです (値は省略します)。
/li>
最後の行が問題です。3 行目から戻って挿入を削除しています。Request オブジェクトに適用しているコマンドはsession.Save(request);
、他には何もありません。
Delete の呼び出しが行われる理由はありますか?
編集:
コードの更新
割引マッピング
リクエスト マッピング
ttp://stackoverflow.com/questions/14837373/zero-to-one-relationship-nhibernate-mapping