Hibernate多対多、同じレコードを複製する

私はvaannilaで与えられた例を使ってアノテーションを使って多対多マッピングを試みました。

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

        Set courses = new HashSet();
        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);

このことはうまくいきます。しかし、後で別のコースを追加しようとすると、既存の学生に、

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

これは学生のEswarを再びテーブルの中に複製します。

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

既存のEswarにコースを追加することはできませんか? 私は本当にこの問題のあなたの助けに感謝します。

1

1 答え

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

このようにして、新しいStudentオブジェクトを作成しています。この新しいstudentオブジェクトは、 "ID"インスタンス変数にnullを持ちます。ルックアップのためにHibernateがこのインスタンス変数をプライマリキーにマッピングしなければならないと思われます。もしidが見つかった場合はレコードが更新され、それ以外の場合は新しいレコードが挿入されます。

はい、既存の生徒のコースを追加する必要がある場合は、Uは最初に取得した生徒オブジェクトからセットを取得してから、そのセットにコースを追加してから保存します。そうでない場合は、新しいハッシュセットにのみ含まれます新しいコース、および前のレコードが上書きされます。

0
追加された
あなたの答えは「それは私のように」から始まる文を除いてOKです。 Session.saveは常に挿入しようとします。既存のエンティティは更新されません。
追加された 著者 JB Nizet,
@JBNizet okz、私は再び実際に私のケースでオブジェクトを探してオブジェクトのいずれかのプライマリキーの値の存在に基づいて保存または更新されました....私はそれを再度チェックし、session.saveOrUpdate(インスタンス)メソッド..... .....ありがとうございました.....
追加された 著者 Zohaib,
ZohaibとJB Nizet、あなたの素晴らしいサポートに感謝します! saveOrUpdate()でうまくいきました。あなたの助けをもう一度ありがとう! :)
追加された 著者 Tharaka Deshan,