2016-03-29 10 views
1

私はHibernate 4.3を使用しています。
私はStudentのエンティティの下に作成しました。Hibernate ManyToMany複数のエントリ

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

    public Student(){ 
    } 

    public Student(String name, Set<Course> courses){ 
     this.studentName = name; 
     this.courses = courses; 
    } 

    @Id 
    @GeneratedValue 
    @Column(name="STUDENT_ID") 
    private long studentid; 
    @Column(name="STUDENT_NAME") 
    private String studentName; 
    @ManyToMany(cascade=CascadeType.ALL) 
    @JoinTable(name="STUDENT_COURSE", 
     [email protected](name="STUDENT_ID"), 
     [email protected](name="COURSE_ID") 
    ) 
    private Set<Course> courses = new HashSet<Course>(0); 

    //Getter Setter Methods 
} 

もう1つのエンティティはCourseです。私のアプリケーションで

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

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

    @Id 
    @GeneratedValue 
    @Column(name = "COURSE_ID") 
    private long courseID; 
    @Column(name = "COURSE_NAME") 
    private String courseName; 

    @ManyToMany(mappedBy="courses") 
    private Set<Student> students = new HashSet<Student>(0); 

    //Getter Setter Methods 

    // I have added equality and hashcode check below 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (!(obj instanceof Course)) { 
      return false; 
     } 
     Course anotherCourse = (Course) obj; 
     // return this.courseName == anotherCourse.courseName; 
     return (this.courseName == null)? anotherCourse.courseName == null : this.courseName.equals(anotherCourse.courseName); 
    } 

    @Override 
    public int hashCode() { 
     return courseName.hashCode(); 
    } 
} 

私は、コードを持っている:上記のケースで

// Configuration and Session creation for Hibernate 

Set<Course> courses = new HashSet<Course>(); 
courses.add(new Course("Maths")); 
Student st1 = new Student("ABCD", courses); 
session.save(st1); 

courses.add(new Course("Physics")); 
Student st2 = new Student("EFGH", courses); 
session.save(st2); 

それは学生の両方のための両方のコースとして、無効なデータを挿入します。 これは間違っていますが、Javaの場合と同じようにオブジェクトは同じです。 しかし、上記のようにコースを地図にしたいと思います。 Hibernateの最後でこれを処理する方法は?

私は別のオプションを試してみました:

Set<Course> courses = new HashSet<Course>(); 
Set<Course> courses1 = new HashSet<Course>(); 
courses.add(new Course("Maths")); 
Student st1 = new Student("ABCD", courses); 

session.save(st1); 

courses1.add(new Course("Maths")); 
courses1.add(new Course("Physics")); 
Student st2 = new Student("EFGH", courses1); 
session.save(st2); 

しかし、今回はそれが同じcourseName = "Maths"ための2つの異なるコースを作成しました。 equalshashCodeメソッドの実装を作成しても、

解決策、これをHibernateで処理する方法が必要です。

return this.courseName == anotherCourse.courseName; 

、あなたはcourseNameのとthis.courseNameのメモリ参照を比較します。

+0

「return this.courseName == anotherCourse.courseName;」という行を 'return(this.courseName == null)に変更しましたか? anotherCourse.courseName == null:this.courseName.equals(anotherCourse.courseName); '。しかし、まだそれは動作していない、それはコース表の '数学 'の2つのレコードを挿入しています。 –

+1

が必要な場合は、まずすべてのコースを保存してから、学生に割り当てて生徒を保存します。 –

+0

最初にすべての「コース」を保存する必要はありません。両方の「数学」コースに同じ目的を持つことが必要でした。私の間違いは、私は '新しいコース(「数学」)を2回していた。 –

答えて

1

私は以下のように問題の解決策を発見した。この中

Course maths = new Course("Maths"); 
Course physics = new Course("Physics"); 

Set<Course> courses = new HashSet<Course>(); 
Set<Course> courses1 = new HashSet<Course>(); 

courses.add(maths); 
Student st1 = new Student("ABCD", courses); 
session.save(st1); 

courses1.add(maths); 
courses1.add(physics); 
Student st2 = new Student("EFGH", courses1); 
session.save(st2); 

私はCourseのためのオブジェクトを作成し、両方のセットで同じオブジェクトを使用していました。したがって、データベースでは、コースMathsのために1つの行エントリのみが作成されます。

このようにして目的が解決されました。 ありがとうございます。

0

私はあなたがこれを行うと、あなたの問題は、

実際Courseクラスでのごequals()メソッドの実装から来ると信じてanotherCourse

代わりに、あなたはこのような等号()メソッド、使用する必要があります。

return this.courseName.equals(anotherCourse.courseName); 

、代わりに参照の文字列の内容を比較します。 2番目の試みで

、あなたは(同じ値を持つ)2つのオブジェクトを作成し、Courseequals()の実装ではなく、その内容のオブジェクトの参照(メモリアドレス)を比較するので、Hibernateはそれらが異なっていると考えているので、 。

+0

私は同じことに関して問題のコメントを追加しました。 –

+0

あなたのソリューションは非常に悪い考えです。あなたは同じオブジェクトを再利用することで問題を解決していますが、解決していません。そのようにしておくと、将来的にバグが発生することは避けられません。あなたがデータベースからそれを取り出して、それを添付する必要があるなら、あなたはどうしますか?あなたのequalsの実装は間違っていますが、無効な簡単なメソッドの実装のためにあなたのbiz-codeを変更しないでください! – niilzon

+0

あなたの解決策を提案してください... –

関連する問題