Hibernate多対多、既存の行をマージ

私は、Hibernateの多対多リレーションシップに関するサンプルプロジェクトを試しました。 http:// www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html それから、既存の生徒にコースを追加するときに同じ生徒を複製するという問題がありましたが、ここに入れられた以前の質問からそれを解決しました。

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

だから今私のコードはこのように:

    Set courses = new HashSet();
    courses.add(new Course("Science"));
    DB db = new DB();
    Student eswar= db.getStudentFromId(1);
    eswar.setCourses(courses);
    session.saveOrUpdate(eswar);

そして同じStudent Eswarがそこにあります。

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

しかし、student_courseテーブルはCOURSE_IDの新しい値で更新されましたが、新しいコースは追加されませんでした。

    +------------+-----------+
    | STUDENT_ID | COURSE_ID |
    +------------+-----------+
    |          1 |         7 | //it was 6 last time
    +------------+-----------+

私は本当にこれを(同じ学生が複数のコースをやることができる)と見なす必要がありました。

    +------------+-----------+
    | STUDENT_ID | COURSE_ID |
    +------------+-----------+
    |          1 |         6 |
    |          1 |         7 |
    |          2 |         7 |
    +------------+-----------+

Student.Java

@Entity
@Table(name = "STUDENT")
public class Student {

private long studentId;
private String studentName;
private Set courses = new HashSet(0);

public Student() {
}

public Student(String studentName) {
    this.studentName = studentName;
}

public Student(String studentName, Set courses) {
    this.studentName = studentName;
    this.courses = courses;
}

@Id
@GeneratedValue
@Column(name = "STUDENT_ID")
public long getStudentId() {
    return this.studentId;
}

public void setStudentId(long studentId) {
    this.studentId = studentId;
}

@Column(name = "STUDENT_NAME", nullable = false, length = 100)
public String getStudentName() {
    return this.studentName;
}

public void setStudentName(String studentName) {
    this.studentName = studentName;
}

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "STUDENT_COURSE", joinColumns = { @JoinColumn(name = "STUDENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "COURSE_ID") })
public Set getCourses() {
    return this.courses;
}

public void setCourses(Set courses) {
    this.courses = courses;
}
}

Course.java

@Entity
@Table(name="COURSE")
public class Course {

private long courseId;
private String courseName;

public Course() {
}

public Course(String courseName) {
    this.courseName = courseName;
}

@Id
@GeneratedValue
@Column(name="COURSE_ID")
public long getCourseId() {
    return this.courseId;
}

public void setCourseId(long courseId) {
    this.courseId = courseId;
}

@Column(name="COURSE_NAME", nullable=false)
public String getCourseName() {
    return this.courseName;
}

public void setCourseName(String courseName) {
    this.courseName = courseName;
}

}

私は本当にあなたの助けに感謝します。

0
注釈を入力してください
追加された 著者 Konstantin Pribluda,
@ ConstantinPribluda私は2つのクラスを今追加しました。
追加された 著者 Tharaka Deshan,

1 答え

コード内で次のようにするだけで済みますし、作業が始まることを願っています         DB db =新しいDB();

    Student eswar= db.getStudentFromId(1);
    Set c = eswar.getCourses();
    c.add(new Course("Science"));
    eswar.setCourses(c);

    session.saveOrUpdate(eswar);

現在、あなたがやっていることは、データベースから生徒を取得し、そのコースを新しいセットに設定することです。この新しいセットには古い古いコースが含まれていません........したがって、callSaveOrUpdate()メソッドを呼び出すと、新しいSETで更新されましたが、この新しいSETには古いエントリが含まれていません....

1
追加された
ありがとうZohaib、あなたは再び私の問題を解決:)
追加された 著者 Tharaka Deshan,
@ Zohaib:こんにちは、私は似たような状況がある、私の質問は、そのような複数のマッピングがある場合、for_loop_i(db.getStudentFromId(i))を行うのが効率的ですか?また、これを手伝ってもらえますか? stackoverflow.com/questions/25771892/…
追加された 著者 PavanSandeep,