データベースに新しい行を挿入しようとしていますが、オブジェクトを挿入する必要があることを Hibernate に認識させることができません。Sponsor テーブル、Course テーブル、および 2 つの共通部分である SponsorCourse テーブルがあります。SponsorCourse の主キーは、スポンサーの主キーとコースの主キーの 2 つの整数を保持するクラス SponsorCoursePK の複合 ID です。SponsorCoursePK は equals() と hashcode() を実装しています。
私の目標は、すべての SponsorCourse 行を含む Course テーブルのディープ コピーです。
- 最初に、既存の Course 行に関連付けられた SponsorCourses のリストを Hibernate に要求します。
- 次に、新しい Course オブジェクトを作成し、それをデータベースにコミットします。(従来の理由により、Course オブジェクトは Hibernate によって管理されません)。
- 次に、Hibernate が古いコース用に提供してくれた SponsorCourses のリストを繰り返し処理し、SponsorCourse のプライマリ キーの、コース ID を保持する部分を古いコース ID から新しく作成されたコースの ID に変更します。
- 次に、saveOrUpdate を呼び出して、Hibernate に新しい行を作成させようとします。
SQL Hibernate 送信を見ると、'insert' ステートメントが存在しません。Hibernate は、新しいオブジェクトが「ダーティ」であり、主キーの一部を変更したにもかかわらず、挿入する必要があることを認識できません。SponsorCourse の他の値を変更すると、Hibernate はオブジェクトをダーティと認識し、新しい行を挿入します。
私の別のアプローチは、まったく新しい SponsorCourse オブジェクトを作成し、それらを永続化することです。主キーが複合主キーではない他の子テーブルでは、行をフェッチし、主キーを変更し、Hibernate がダーティ オブジェクトに基づいて新しい行を挿入できるように見えるため、混乱しています。主キー。
Hibernate ドキュメント、特に Hibernate 3.0 リファレンスの第 8.4 章 (複合 ID) と第 10 章 (オブジェクトの変更についての議論) は、私が理解するのに十分ではありませんでした。
Hibernate によってフェッチされたオブジェクトの主キーを変更できると考えて、新しい行が挿入されると考えて、何か問題があると予想していますか? そのような状況では、常に独自の新しいオブジェクトを作成する必要がありますか? それとも、複合 ID である主キーの一部を変更して挿入を強制しようとすることに固有の問題ですか?
ありがとうございました。おそらく明らかに、私はフレームワークに不慣れです。