問題タブ [hibernate-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.
java - デタッチされたオブジェクトを更新するときに、Hibernate は孤立したコレクションを削除できますか?
孤立した子オブジェクトを削除することは、SO に関するよくある質問であり、Hibernate を初めて使用する人にとってよくある問題であり、かなり標準的な答えは、または子コレクションに何らかのバリエーションがあることを確認することであることを知っていcascade=all,delete-orphan
ますcascade=all-delete-orphan
。
子コレクションが親オブジェクトから空/削除されたことをHibernateに検出させ、親オブジェクトが更新されたときに子テーブルの行をデータベースから削除できるようにしたいと思います。例えば:
Parent
クラスの現在のマッピングは次のようになります。
アタッチされたオブジェクトを更新する場合、これはうまく機能しますが、デタッチされたオブジェクト (HTTP/JSON を介してリモート クライアントによって API メソッドに送信されたもの) を取得できるようにしたいユース ケースがあります。そしてそれを Hibernate Session に直接渡します - クライアントが好きな方法で親オブジェクトを操作し、変更を永続化できるようにします。
デタッチされたオブジェクトを呼び出すsession.update(parent)
と、子テーブルの行は孤立しますが (FK 列は null に設定されます)、削除されません。を呼び出しているsession.update()
とき、Hibernate セッションがこのオブジェクト インスタンスを確認するのはこれが初めてであることに注意してください。他の方法でオブジェクトをセッションに再アタッチしたり、マージしたりすることはありません。私はクライアントに依存して、データベース内の実際のオブジェクトに対応する識別子を持つオブジェクトを渡します。たとえば、API サービス メソッドのロジックは次のようになります。
Hibernate が に渡されたときに、切り離された親オブジェクトの孤立した子コレクションを検出することは可能session.update(parent)
ですか? または、切り離されたオブジェクトを何らかの方法で誤用していますか?
私の望みは、切り離されたインスタンスへの変更を保持するために、Hibernate とのあらゆる種類の複雑な対話を回避できることでした。私の API メソッドは、 への呼び出し後にデタッチされたオブジェクトをさらに変更する必要はありませんsession.update(parent)
。このメソッドは、リモート クライアント アプリケーションによって行われた変更を保持するだけです。
grails - 多対多の関連付けを作成し、カスケードを防止します
したがって、お客様と役割の間には多対多の関係があり、次のように設定されます。
Roleオブジェクトには、名前と一連の権限のみがあります。ロールは直接変更されるだけなので、Customer->Roleからの保存をカスケードする必要はありません。
追加した:
ただし、顧客を作成するたびに、役割テーブルも更新されます。バージョン番号がインクリメントされることを除いて、何も変更されません。
設定する必要のある他の何かが欠けていますか...Grailsで設定されている多対多の関係とカスケードにバグがあります...またはロールが毎回更新されないようにする他の方法はありますか?
nhibernate - nhibernate(またはhibernate)条件付きカスケード
私には、多くのセッションを持つプロパティEventを持つクラスUserがあります。基本的に、ユーザーはセッション時間が長いイベントに登録します。
ユーザーはイベントに登録できますが、セッション時間は純粋に有益です。
しかし、NHを使用してデータベースにユーザーを書き込むと、セッション時間も更新されます。イベントを作成/更新するときにセッション時間を挿入/更新する必要があることを知っているので、どうすればそれを防ぐことができますか。
java - CascadeType.ALL と @OnDelete の違いを理解しようとしています。
エンティティが削除された場合、ここを使用すると、これと他のエンティティ@OnDelete
が削除されますか? Hibernate の注釈参照から何かを理解できない..だから、正しく理解していることを確認するためにあなたの助けが必要だ.InventoryPreference
Inventory
エンティティが削除された場合、エンティティですべてのs を削除するためにもInventory
使用する必要がありますか?CascadeType.ALL
InventoryPreference
Inventory
最初の質問が正しければ、 の要点がわかりませんCascadeType.ALL
。そうでない場合、これらのそれぞれは何をし、が削除InventoryPreference
されたときに s を削除するために指定する必要がある注釈と構成は何Inventory
ですか? Inventory
ああ、削除されても削除されたくありませんInventoryPreference
。あまりにも明白である場合は申し訳ありません。
java - 子エンティティが挿入されていない場合にカスケードする方法、それ以外の場合はカスケードしない
現在、Seam フレームワークを使用しています。また、エンティティに注釈を付ける際に少し問題があります。Tag エンティティの子を持つ Deal エンティティがあります。エンティティに次のように注釈を付けました。
タグエンティティは次のようになります。
ユースケースは次のとおりです。取引をタグ付けするためのデフォルト値があります。ユーザーは、オートコンプリーターの入力ボックスでタグを検索します。一致しない場合は、独自の無料タグを入力します。ディール エンティティを永続化する場合、DB にタグが保存されていない場合はタグ エンティティが永続化されます。それ以外の場合は、保存されたタグ エンティティを取引エンティティに参照します。
このユース ケースに適合するエンティティに注釈を付けることができますか? それともビジネスロジックのすべてですか?
hibernate - Hibernate カスケードを正しくセットアップする方法
次のセットアップがあります
A -> B -> C
A-マッピング:
B:
SubstanceItentifiedI18n:
完全なオブジェクトグラフを使用して新しい A を挿入すると、
すべてが正しく作成されます。
しかし、私が使用する場合
私はDataIntegrityException
log4j ログを見ると、merge
- それは挿入します
B
- それは挿入します
B18n
saveOrUpdate
それと_
- inserts
B18n
、明らかに例外が発生します
これは定義された(予想される)動作ですか、それとも私の設定に何か問題がありますか。
hibernate - Hibernate @OnDelete 同じテーブルをカスケードする
ツリーのように、親子関係をキャプチャするテーブルを作成しようとしています。この構造「id」と「parent」をキャプチャするために、2 つの列のみを維持したいと考えています。行が削除されたときに、データベースがすべての子をカスケード削除できるようにしたいと考えています。以下は私が作成したHibernate Entityです。注釈を追加しましたが@OnDelete(action = OnDeleteAction.CASCADE)
、ON DELETE CASCADE
Hibernateによってテーブルが作成されたときにテーブルに追加されません。
これはバグですか?それとも、私が見逃している、または理解していないものがありますか?
java - Hibernate: 双方向の 1 対多の外部キー制約が失敗する
Hibernate (Java) を使用して 1 対多の関係を実装したいと考えています。私は2つのエンティティを持っています:
- 実験
- 実験グループ
Experiment
が多いExperimentGroups
。公式の Hibernate ドキュメントが推奨する方法で、この 1 対多の関係を構成しようとしました: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/example-parentchild.html#例-親子-カスケード
私の設定ファイル:
ExperimentGroup
newを追加するExperiment
と問題なく動作しますが、Experiment (およびそのすべての ExperimentGroups) を削除すると例外が発生します。
親行を削除または更新できません: 外部キー制約が失敗しました (
testdb
.ExperimentGroup
, CONSTRAINTFK9C71D86238B5500C
FOREIGN KEY (Experiment_id
) REFERENCESExperiment
(id
))
私の ExperimentDAO コードは次のようになります。
編集: 実験と実験グループを作成するための DAO コード:
名前、説明など、Experiment には他にも多くのプロパティがありますが、それらは 1 対多の関係に影響を与えないため、構成ファイルから削除しました。
なにか提案を?私は何を間違えたのですか?
hibernate - Hibernate、一方向のManyToOneと「OnDeleteCascade」機能への要望
ここに示したものと同じ問題があります:休止状態の多対1マッピングで逆カスケード削除を定義する方法
しばらく検索した後、私はこれのためのまともな/きれいな解決策を見つけることができません。親エンティティが異なるモジュールにあるため、子に@OneToManyを持たせることはできません。親が削除される前に子を削除するEntityListenerを試してみたかったのですが、やはり、子が異なるモジュールにあるため、できません。
誰かがこれに対するクリーンな解決策を知っていますか?AspectJを使用してParentDaoからのdeleteメソッドの呼び出しをリッスンすることを考えていますが、これはクリーンなソリューションではなく、Parentクラスとこのような関係を持つエンティティごとに1つ実装する必要があります。
この種のカスケードは基本的な機能のようであり、休止状態がそれをサポートしていないことに私は少しがっかりしています:/
java - 更新の保存時に NonUniqueObjectException を休止状態にする
私はこの単純な状況を持っています:
新しい顧客を挿入するルーチン:
この問題を解決するにはどうすればよいですか? 問題は CascadeType.SAVE_UPDATE に関連していると思いますが、必要です... ありがとうございます。
アップデート
私は問題を見つけました、そしてこれはそれを再現する方法です:
したがって、p と p 1 のカテゴリが異なる場合、確率はありませんが、p と p1 が同じカテゴリの場合、同じカテゴリがセッションにあり、休止状態で save_update を試みるため、Category に NonUniqueObjectException があります。
製品エンティティとカテゴリ エンティティの両方で CascadeType.SAVE_UPDATE が必要ですが、この問題を解決するにはどうすればよいですか? ありがとう。