データベースに新しい行を挿入しようとしていますが、オブジェクトを挿入する必要があることをHibernateに認識させることができません。私はスポンサーテーブル、コーステーブル、そして2つの間の交差点であるスポンサーコーステーブルを持っています。 SponsorCourseの主キーは、スポンサーの主キーとコースの主キーの2つの整数を保持するクラスSponsorCoursePKの複合IDです。 SponsorCoursePKはequals()& hashcode()を実装しています。Hibernate:composite-id主キーの一部を変更して新しい行を挿入しますか?
私の目標は、SponsorCourseのすべての行を含むCourseテーブルのディープコピーです。
- 私は最初に、関連するスポンサーコースのリストを の既存のコース行と照合するようにHibernateに依頼します。
- 次は新しいCourseオブジェクトを作成し、それをデータベースにコミットします。 (従来の理由のために、CourseオブジェクトはHibernateによって管理されません)。
- 次へ私はHibernateが古いコースのために私に与えたSponsorCoursesのリストを反復し、古いcourseidからcourseidを保持するSponsorCourseの主キーの部分を新しく作成されたコースのIDに変更します。
- 次に、saveOrUpdateを呼び出して、Hibernateに新しい行を作成させようとします。
私はSQL休止状態を見てみると送信し、何の「挿入」ステートメントが存在しない:Hibernateは私の新しいオブジェクトが「汚い」であることを認識して挿入する必要があるために失敗し、私は主の一部を変更したにもかかわらず、キー。 SponsorCourseの他の値を変更した場合、Hibernateはそのオブジェクトをdirtyとして認識し、新しい行を挿入します。
私の代わりの方法は、全く新しいSponsorCourseオブジェクトを作成し、それを永続化することです。主キーが複合主キーでない他の子テーブルでは、行をフェッチし、主キーを変更して、Hibernateに新しい主キー。
Hibernateのドキュメント、特に第8.4章(複合ID)& Hibernate 3.0リファレンスの第10章(オブジェクトの変更について議論しています)は、わかりやすいものではありません。
私はHibernateによってフェッチされたオブジェクトの主キーを変更し、新しい行を挿入すると思って何か間違っていると思いますか?私はいつも自分のもの、新しいもの、そのような状況のオブジェクトを作成すべきですか?または、コンポジットIDであるプライマリキーの一部を変更して挿入を強制しようとする際にユニークな問題ですか?
ありがとうございます。おそらく、明らかに、私はフレームワークの初心者です。