2011-10-28 10 views
0

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

Hibernate Many-to-Many, duplicates same record

は、だから今、私のようなコード:

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

、同じ学生Eswarがあります。

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

しかしstudent_courseテーブルがちょうどCourse_IDにに新しい値で更新が、新しいコースを追加していません。

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

本当にこのようにこれを確認するために必要なI(同じ生徒がいくつかのコースを行うことができます):

+------------+-----------+ 
    | 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<Course> courses = new HashSet<Course>(0); 

public Student() { 
} 

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

public Student(String studentName, Set<Course> 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<Course> getCourses() { 
    return this.courses; 
} 

public void setCourses(Set<Course> 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

注釈を指定してください –

+0

@ ConstantinPribluda今すぐ2つのクラスを追加しました。 –

答えて

1

あなたはコード内で次のことを行うだけで、作業を開始することを願っています。 DB db = new DB();

現在uは何をしているか
Student eswar= db.getStudentFromId(1); 
    Set<Courses> c = eswar.getCourses(); 
    c.add(new Course("Science")); 
    eswar.setCourses(c); 

    session.saveOrUpdate(eswar); 

は、データベースからの学生を取得し、新しいセットにそのコースを設定している、この新しいセットは、古い古いのコースが含まれている........のでUがcallSaveOrUpdate(しません。 )メソッドでは、同じ生徒が新しいSETで更新されますが、この新しいSETには古いエントリが含まれていません。

+0

ありがとうZohaib、あなたは再び私の問題を解決しました:) –

+0

@ Zohaib:こんにちは、私は同じような状況があります、私の質問は、複数のそのようなマッピングがある場合、for_loop_i(db.getStudentFromId(i))を行う効率的ですか?また、これを手伝ってもらえますか?http://stackoverflow.com/questions/25771892/column-insertable-updateble-dont-go-well-with-spring-jpa – PavanSandeep

関連する問題