問題タブ [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.
sql-server - SQL Server DRI (ON DELETE CASCADE) は遅いですか?
私は、システムの 1 つで繰り返される「バグ レポート」(パフォーマンスの問題) を分析しており、特に遅い削除操作に関連しています。簡単に言えば、キーが主な原因であると思われCASCADE DELETE
ます.(a)これが理にかなっているのか、(b)なぜそうなのかを知りたい.
たとえば、関連テーブルや関連テーブルなどの大きなグラフのルートにあるウィジェットなどのスキーマがあります。完全に明確にするために、このテーブルから削除することは積極的に推奨されていません。それは「核の選択肢」であり、ユーザーは逆に幻想を抱くことはありません。とはいえ、やらなければならないこともあります。
スキーマは次のようになります。
列の定義は次のようになります。
怖すぎることはありません。aWidget
は異なる型にすることができ、 anAnvil
は特別な型であるため、関係は 1:1 (より正確には 1:0..1) になります。次に、硬度、腐食、正確な重量、ハンマーの互換性、使いやすさの問題、および漫画の頭での衝撃テストを扱う、大量のデータがありますAnvilTestData
。Anvil
次に、それぞれWidget
に、生産、在庫の移動、販売、欠陥調査、RMA、修理、顧客からの苦情など、さまざまな種類のトランザクションの長くて退屈な履歴があります。その年齢に応じて。
したがって、当然のことながら、CASCADE DELETE
ここにはあらゆるレベルで関係があります。を削除する必要がある場合Widget
、それは何かがひどく間違っていることを意味し、履歴、テスト データなどを含む、そのウィジェットの既存の記録をすべて消去する必要があります。
関係はすべて索引付けされ、統計は最新です。通常のクエリは高速です。システムは、削除を除くすべての処理で非常にスムーズに動作する傾向があります。
最後に、さまざまな理由から、一度に 1 つのウィジェットしか削除できないため、delete ステートメントは次のようになります。
非常にシンプルで無害に見える削除...データのないウィジェットの場合、実行に2分以上かかります!
実行計画をたどった後、最終的にコストが最も高いサブ操作としてAnvilTestData
と削除を選択することができました。WidgetHistoryDetails
そこで、 をオフにしてCASCADE
(ただし、実際の FK を に設定するだけでNO ACTION
)、スクリプトを次のように書き直して実験しました。
これらの「最適化」はどちらも大幅なスピードアップをもたらし、それぞれが実行時間をほぼ 1 分短縮したため、元の 2 分間の削除は約 5 ~ 10 秒かかりました - 少なくとも新しいウィジェットの場合、多くの履歴やテストは必要ありませんデータ。
完全に明確にするために、ファンアウトが最も高いCASCADE
from からWidgetHistory
までがまだあります。ここでは からのものだけを削除しました。WidgetHistoryDetails
Widgets
カスケード関係をさらに「フラット化」すると、徐々に劇的ではなくなりますが、それでも顕著なスピードアップが見られ、より大きなテーブルへのカスケード削除がすべて削除され、明示的な削除に置き換えられると、新しいウィジェットの削除がほぼ瞬時に行われるようになりました。
私は各テストの前にDBCC DROPCLEANBUFFERS
andを使用しています。DBCC FREEPROCCACHE
さらにスローダウンを引き起こす可能性のあるすべてのトリガーを無効にしました (ただし、それらはいずれにせよ実行計画に表示されます)。また、私は古いウィジェットに対してもテストを行っており、そこでも大幅な高速化が見られます。以前は 5 分かかっていた削除が 20 ~ 40 秒で完了します。
現在、私は「SELECT は壊れていない」という哲学の熱烈な支持者ですが、この動作について論理的な説明はないようですCASCADE DELETE
。
だから、私の質問は次のとおりです。
これは SQL Server の DRI に関する既知の問題ですか? (Google や SO でこの種のことへの言及を見つけることができなかったようです。答えはノーだと思います。)
そうでない場合、私が見ている動作について別の説明がありますか?
これが既知の問題である場合、なぜそれが問題なのですか? また、使用できるより良い回避策はありますか?
java - Hibernate アノテーションのカスケードが機能しない
hbm.xml スタイルを休止状態を使用して注釈に変更することにしました。私はhbm.xmlに持っていました:
そしてそれを次のように変更しました:
ユーザークラス:
Hibernate.cfg.xml
セッションを取得する Java コード
License オブジェクトを保存するための Java コード
生成されたSQL:
APPEND_1: 作業コード
また、休止状態は保存時にユーザーを保存しません。本当に助けが必要です!
java - Hibernateカスケード
Hibernateリバースエンジニアリングが生成するものはすべて次のようなものです
このシナリオが必要です。セッションがフラッシュされると、FKの制約に従って、最初にすべての構築された子が保存され、次に親オブジェクトが保存されました。
もちろん、FKの制約があるため、子供を最初に(自動的に!)保存する必要があります。
CASCADEオプションがありますが、JPAでどのように使用するのですか?
次のようにカスケードを追加してみました。
私には効かない。
最初に教えてください:このディレクティブで注釈を付ける必要があるものと、それを機能させる方法。
「子行を追加または更新できません:外部キー制約が失敗します」という例外が発生します。
そして確かに、私はすべてを手で固執したくありません!1つのオブジェクトのみを作成し、それを永続化します。
何に注釈を付け、どのディレクティブをどのように使用しますか?
mysql - カスケード削除時のmysqlが機能しない
mysqldbでONCASCADEDELETEを使用しようとしていますが、機能させることができません。これが私のコードです:
次に、sometableへの挿入を実行します。これにより、UUIDが生成されます。このUUIDを取得して、テーブルpに挿入します。p(testId、phrase、source)values( '07616f60-424f-11df-871a-b98e9'、'fun'、'test');に挿入します。
あるテーブルの行を削除すると、テーブルpでは何も起こりません。私が見逃したこと、または私が間違っていること
java - Hibernate およびカスケード操作での 1:M 関係
テーブル SUBCOURSE は COURSE COURSE(id, name) SUBCOURSE(id, course_id, name) を参照します
では、1:M.
Hibernate はコース用に生成します:
生成するサブコースの場合
問題は、カスケードが期待どおりに機能しないことです。SubCourse オブジェクト (Set) のコレクションを作成し、それを埋めてから、Course オブジェクトの setSubCourses() にバインドします。次に、単にコース オブジェクトを永続化します。
ただし、Subcourses テーブルに ManyToOne があるため、各オブジェクトのコレクションに追加する前に手動で setCourse() する必要があります。そうしないと、Course オブジェクトとそのコレクションを永続化するときに例外が発生します。
何をお勧めしますか?
PS または多分これはゲームの一部ですか? すべての子の親オブジェクトを手動で設定しますか?
java - Hibernate-カスケードが機能するようにnull値を設定する方法[興味深い!]?
分離されたオブジェクトについて話しているのですが、後でsaveOrUpdate()で更新したいと思います。
参照されるコレクションをnullとclear()に同時に設定するにはどうすればよいですか?
A [1:1] B [1:M] C
BからCへの参照はnullになる可能性があります。これは、Bに対するCのレコードがないことを意味します。
同時にBをnullに設定して、すべてのCレコードがデータベースから削除されるようにしたいと思います。そして、saveOrUpdate A!
カスケードは、孤立の削除を含むすべてを休止状態にするように設定されています。
B.clear()を実行すると、Cからすべてのレコードが削除されます。
Bをnullに設定すると、Bがnullに設定されますが、Cレコードは削除されません。(なんて残念です!本当に便利ではありません!)
ではどうですか?
実際には、状況は奇妙です。
2つのトランザクションで回避策が見られます。最初のトランス:コレクションをクリアします。トランザクションをコミットします。
これで、すべてのCレコードが削除されます。
2番目のトランザクション:A.setB(null)。専念。これにより、フィールドがNULLに設定されます。
しかし、それを1つのステップで行う方法は?
ms-access - Access2007の複数のカスケードドロップダウンボックスにデータを入力する
私は、MS Access 2007で一時的な顧客追跡システムを設計するタスクを割り当てられました(sheeeesh!)。テーブルとリレーションシップはすべて正常にセットアップされました。しかし、1つのテーブルのデータ入力フォームを設計しようとしているときに、小さな問題が発生しました...最初に少し説明します。
画面には、3つのドロップダウンボックスが含まれています(他のフィールドは別として)。
最初のドロップダウン
最初のドロップダウン(cboMarket)は、ユーザーが2つのオプションから選択できるマーケットを表します。
- 国内
- 国際的
最初のドロップダウンには2つのアイテムしか含まれていないので、わざわざテーブルを作成する必要はありませんでした。事前定義されたリストアイテムとして追加しました。
2番目のドロップダウン
ユーザーがこれを選択すると、2番目のドロップダウン(cboLeadCategory)に、見本市と展示会、エージェント、プレス広告、オンライン広告などのリードカテゴリのリストが読み込まれます。2つの市場で異なるリードカテゴリのセットが使用されます。 。したがって、このボックスは最初のボックスに依存しています。
2番目のコンボのLead_Cateogriesという名前のバインドされたテーブルの構造は次のとおりです。
3番目のドロップダウン
また、2番目のカテゴリの選択に基づいて、3番目のカテゴリ(cboLeadSource)は、特定のカテゴリに属する事前定義されたリードソースのセットを表示することになっています。
テーブルの名前はLead_Sourcesで、構造は次のとおりです。
1番目のドロップダウンで選択を行うと、コンボのAfterUpdateイベントが呼び出され、2番目のドロップダウンにコンテンツをロードするように指示します。
2番目のコンボの行ソースにはクエリが含まれています。
2番目のコンボのAfterUpdateイベントは次のとおりです。
3番目のコンボの行ソースには次のものが含まれます。
問題
cboMarketからマーケットタイプを選択すると、2番目のコンボcboLeadCategoryが問題なく適切なカテゴリをロードします。
しかし、そこから特定のカテゴリを選択すると、リードソース名をロードする3番目のコンボの代わりに、パラメータの入力を求めるモーダルダイアログが表示されます。
代替テキストhttp://img163.imageshack.us/img163/184/enterparamprompt.png
このプロンプトに何か(有効または無効なデータ)を入力すると、さらに別のプロンプトが表示されます。
代替テキストhttp://img52.imageshack.us/img52/8065/enterparamprompt2.png
なぜこうなった?3番目のボックスが必要に応じてソース名をロードしないのはなぜですか。誰かが私が間違っているところに光を当てることができますか?
ありがとう、m ^ e
================================================== =
アップデート
3番目のコンボのクエリに不具合が見つかりました。2番目のコンボの値と一致していませんでした。私はそれを修正しました、そして今クエリは次のようになります:
それらの厄介なEnterParamプロンプトはなくなりました!!! ただし、3番目のコンボはまだ頑固に値をロードすることを拒否します。何か案は?
nhibernate - カスケードがdelete-all-orphanの場合、NHibernateで子の親を変更するにはどうすればよいですか?
私は双方向の1対多の関係にある2つのエンティティを持っています:
そしてマッピング:
AStorage
は多数持つことができますBoxes
が、aBox
は1つにしか属することができませんStorage
。1対多がのカスケードを持つようにそれらをマッピングしましたall-delete-orphan
。
ボックスを変更しようとすると問題が発生しStorage
ます。私がすでにこのコードを実行したと仮定します:
次のコードは私に例外を与えます:
次の例外が発生します。
NHibernate.ObjectDeletedException:削除されたオブジェクトはカスケードによって再保存されます(削除されたオブジェクトを関連付けから削除します)
この例外は、カスケードがに設定されているために発生しall-delete-orphan
ます。最初に、コレクションからStorage
を削除したことを検出しBox
、削除のマークを付けました。ただし、(同じセッションで)2番目に追加するとStorage
、ボックスを再度保存しようとし、ObjectDeletedException
がスローされます。
私の質問は、この例外が発生することなくBox
、親を変更するにはどうすればよいですか?Storage
考えられる解決策の1つは、カスケードを単にに変更することですall
が、NHibernateでを削除し、別のカスケードに再度関連付けないBox
ようにするだけで、自動的に削除することができなくなります。Storage
それとも、これがそれを行う唯一の方法であり、それSession.Delete
を削除するためにボックスを手動で呼び出す必要がありますか?
sql - 既存のテーブルに削除カスケードを追加するtsqlスクリプト
既存のテーブルのカスケード削除を有効にするために使用できるスクリプトはありますか。ありがとう。
mysql - Hibernateはカスケードを生成しません
hibernate.hbm2ddl.auto
Hibernateがmysqlにテーブルを作成するように作成するセットがあります。
Cascade
ただし、休止状態がテーブル内の参照を正しく追加しているようには見えません。ただし、たとえば行を削除する場合は機能し、休止状態のアノテーションとして削除カスケードがあります。つまり、Hibernateは実行時にアナウンスを読み取り、カスケードを手動で実行するということですか?
それは正常な動作ですか?
例えば:
ここでは、カスケードをALLに設定しました。ただし、実行中show create table Report
外部キー以外のカスケードについては何も述べていません。私の意見では、それは追加する必要がありますON DELETE CASCADE ON DELETE UPDATE