2011-10-28 21 views
1

vaannilaで与えられた例で注釈を使って多対多マッピングを試みました。Hibernateの多対多は同じレコードを複製します

http://www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html

 Set<Course> courses = new HashSet<Course>(); 
     courses.add(new Course("Maths")); 
     courses.add(new Course("Computer Science")); 

     Student student1 = new Student("Eswar", courses); 
     Student student2 = new Student("Joe", courses); 
     session.save(student1); 
     session.save(student2); 

この事は正常に動作します。しかし、私はそれは表に再び学生Eswarを複製し、

 Set<Course> courses = new HashSet<Course>(); 
     courses.add(new Course("Science")); 
     Student student = new Student("Eswar", courses); 
     session.save(student); 

既存の学生のように、後から別のコースを追加しようとした場合。

 +------------+--------------+ 
     | STUDENT_ID | STUDENT_NAME | 
     +------------+--------------+ 
     |   1 | Eswar  | 
     |   2 | Joe   | 
     |   3 | Eswar  | 
     +------------+--------------+ 

既存のEswarにコースを追加できませんか? この問題のお手伝いを本当にありがとうございます。

答えて

0

まず、データベースからスチューデントを取得し、そのオブジェクトにコースを追加し、フェッチされたオブジェクトを保存する必要があります。

このようにして、新しいStudentオブジェクトを作成しています。この新しいstudentオブジェクトは、 "ID"インスタンス変数にnullを持ちます。 IDが見つかった場合はレコードが更新され、それ以外の場合は新しいレコードが挿入されます。

そして、もしあなたがコースを追加する必要があるなら、Hibernateはこのインスタンス変数を検索するためにプライマリキーにマッピングする必要があります。既存の生徒は、まず、取得した生徒のオブジェクトからセットを取得し、そのセットにコースを追加してから保存してもかまいません。新しいハッシュセットには新しいコースのみが含まれ、前のレコードは上書きされます。

+1

"私のように見える"という文を除いて、あなたの答えはOKです。 Session.saveは常に挿入しようとします。既存のエンティティは更新されません。 –

+0

@JBNizet okz、私はもう一度見て、実際に私の場合オブジェクトは、オブジェクトのプライマリキー値の存在に基づいて、保存または更新されました....私はそれを再度チェックし、私たちはsession.saveOrUpdateを使用していたインスタンス)メソッド..... 訂正ありがとう..... – Zohaib

+0

ZohaibとJB Nizet、あなたの素晴らしいサポートに感謝します! saveOrUpdate()でうまくいきました。 もう一度お返事いただきありがとうございます。 :) –

関連する問題