問題タブ [all-delete-orphan]
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.
database - 複数のキーの nHibernate Cascade="Delete-Orphan"
次の3つのテーブルがあるとしましょう:
表A、表B、表C。
テーブル C にはテーブル A への外部キーがあります。テーブル C にはテーブル B への外部キーがあります。
テーブル BI から行を削除するときに、テーブル C の孤立した行を削除したいのですが、テーブル A への参照を保持していない場合のみです。テーブル AI への参照を保持している場合は、テーブル B の行を削除し、テーブル C で外部キーを null に設定します。
それは可能ですか?デフォルトの動作は何ですか?
reference - Fluent NHibernate リファレンス / 多対 1 マッピング カスケードがすべて機能しない
すべてをカスケード (孤立) し、データベースから古いオブジェクトを削除することに問題があります。
例: クラス B のオブジェクトを含むクラス A があります。クラス A のオブジェクトを作成して保存すると、すべて正常に動作します。メソッドを呼び出してSetValueOfB(int i)
オブジェクト A を再度保存すると、古いオブジェクト B がまだデータベースに残っています。
クラス間の関連付けは常に方向性を持たなければなりませんか (すべての HasMany/Reference/HasOne...)? (しかし、オブジェクト b はオブジェクト a について何も知りません)
一方向の関連付けの問題を解決する方法はありますか?
1 対 1 のマッピングが必要ですか? オブジェクト B はオブジェクト A にのみ属することができるためです (A はパラメーターであり、B は値です)。
失敗したテストは次のとおりです。
}
または、ここにプロジェクトがあります: vs プロジェクト
hibernate - hibernate 4.1.4 の all-delete-orphan の注釈
この休止状態の注釈は初めてです。この xml マッピングを注釈に変換したい:
これは私がやったことです:
しかし、非推奨なので、注釈を介してCascadeType.DELETE_ORPHAN
どのように表現すればよいですか? all-delete-orphan
休止状態 4.1.4 を使用しています。
java - @ManyToOneに適用された場合、Hibernate @Cascade(CascadeType.DELETE_ORPHAN) は正しいですか?
シナリオを想像してみましょう: EntityCompany
と EntityAddress
には一対多の双方向の関係があります。したがって、エンティティAddress
は次のようになります。
これらのコードを非推奨のHibernate 4.3
場所に移行します。CascadeType.DELETE_ORPHAN
に置き換えようとするCascadeType.DELETE_ORPHAN
とorphanRemoval = true
、 にorphanRemoval = true
も存在しないよう@ManyToOne
です。
だから私の質問は:
間違って
AddressHbm
使用@Cascade(CascadeType.DELETE_ORPHAN)
しますか?@ManayToOne
@Cascade(CascadeType.DELETE_ORPHAN)
ここで誤用されている場合は、削除するだけで有効ですか?
java - Hibernate でオーファン削除を使用する
私はSpring-Hibernate
アプリケーションで作業しています。私の質問はorphan removal
、以下のコードで説明されているように関連しています。
save/update User
シナリオを考える。1 つの方法は、その子オブジェクトを のようにリストから削除することuser.getUserRoles().remove(userRole)
です。
もう 1 つの方法は、子リストをクリアしuser.getUserRoles().clear()
てから、リクエストに含まれるユーザー ロールが何であれ、それをリストに追加するようなものです。この場合、リクエストに含まれていないユーザー ロールは によって削除されorphan removal
ます。
どちらがより良く、より正しいですか?
hibernate - 孤立した削除に必要な複数の保存を休止状態にする
次のエンティティ モデルを検討してください。
ドシエ エンティティ。
手数料エンティティ。
ブラケット エンティティ。
今、ドシエからのコミッションを置き換えたいとき。私はこれをしなければなりません:
リポジトリでの保存操作では、渡されたオブジェクトに ID が設定されているかどうかに応じて、永続化またはマージが行われることに注意してください。
正気の普通の人は、単純にできると思うでしょう:
何らかの理由で、コミッションにブラケットが付いているかどうかに関係なく、次のことを行う必要があります。
- 既存のコミッションのブラケットをクリアします
- 保存
- 既存の手数料を削除
- 保存
- 新しい手数料を維持する
- ドシエに新しい手数料を設定する
- 保存
ステップのいずれかをスキップすると、次のエラーが発生します。
cascade="all-delete-orphan" を持つコレクションは、所有エンティティ インスタンスによって参照されなくなりました: Commission.commissionBrackets
これにはもっともらしい説明があるかもしれませんが、それは非常に醜く感じられ、おそらくそれを行うよりクリーンな方法がありますか? 既存のコミッションを削除する代わりに、完全に更新することもできますが、それは実際の機能を反映していません。
使用される Hibernate バージョン: 4.3.10.Final DB 使用: postgres 9.4.4.1
だから私の質問はです。私はそれを正しくやっていますか、それともどこかで改善されていますか?
sql - postgres で孤立したレコードを削除します。結合を使用して削除します。パフォーマンス
孤立したテーブルを定期的にクリーンアップする必要がある場合があるため、高性能のソリューションを探しています。「IN」句を使用してみましたが、それほど高速ではありません。列には、両方のテーブルに必要なすべてのインデックスがあります。(id - 主キー、component_id - インデックス、component_type - インデックス)
基本的には、「component_live」テーブルに存在しない「component_apportionment」テーブルからレコードを削除する場合です。
上記のクエリのクエリ プランもひどいものです。
助けていただければ幸いです。ありがとう
ノート
最悪の場合、テーブルにはそれぞれ約 80mln のレコードがあります。両方のテーブルには、使用された列にインデックスがあります。
アップデート
「存在しない」のクエリ プラン
クエリ:
両方のテーブルとより多くのデータで seq スキャンを実行すると、処理が遅くなります。
c# - Hibernate の多対多の全削除オーファン
私は 2 つのエンティティを持っています:多対多の関係で接続されていますDocument
。File
次のように動作するようにします。
- ドキュメントには多くのファイルがあります。
- ファイルは、同時に多くのドキュメントに属することができます。
- ドキュメントを削除すると、別のドキュメントに属していない限り、各ファイルも削除する必要があります。
- ドキュメントからファイルを削除すると、別のドキュメントに属していない限り、削除する必要があります。
エンティティ:
マッピング:
の 2 つのインスタンスをDocument
、同じファイルを内部に保存しました。Document.Files からファイルを削除しようとすると、またはドキュメント全体を削除しようとすると、次の例外が発生します。
削除できませんでした: [MyNameSpace.Files.Business.File#1][SQL: DELETE FROM File WHERE FileId = ?]
内部例外:
親行を削除または更新できません: 外部キー制約が失敗しました (
my_base
.documentfile
, CONSTRAINTFKDB8FFE6221523AA6
FOREIGN KEY (FileId
) REFERENCESfile
(FileId
))
確かにそういう制約はあるし、守りたい。問題は、マッピングで明示的に伝えたときに、NHibernate がそれを削除しようとする理由です。Cascade.AllDeleteOrphan()
python - 「delete-orphan」カスケードによってインスタンスが削除されたことを検出するにはどうすればよいですか?
after_flush
リスナーに実装したいくつかのテーブルに監査ログを追加しようとしています。session.new
//でセッション状態にアクセスすることで、必要な情報を取得できますdirty
。deleted
まあ、少なくともほとんどの場合: 「delete-orphan」カスケードを介して削除されるインスタンスを特定することはできません。これらのインスタンスは に表示されませんが、 に表示されsession.deleted
、session.dirty
それらが削除されるかどうかを判断する方法が見つかりません。
このおもちゃのモデルを使用して説明します。
通常の追加/更新/削除の識別は意図したとおりに機能します。
これまでのところすべて順調です。ただし、関係を介して著者の投稿を更新すると、「元の」投稿がカスケードを介して削除されます。この削除された投稿は、削除されたものではなく、ダーティとしてのみ表示されます。
この投稿が削除される (または、after_flush
リスナーの場合は削除された) ことをどのように検出できますか?