私は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つの異なるコースを作成しました。 equals
とhashCode
メソッドの実装を作成しても、
解決策、これをHibernateで処理する方法が必要です。
return this.courseName == anotherCourse.courseName;
、あなたはcourseName
のとthis.courseName
のメモリ参照を比較します。
「return this.courseName == anotherCourse.courseName;」という行を 'return(this.courseName == null)に変更しましたか? anotherCourse.courseName == null:this.courseName.equals(anotherCourse.courseName); '。しかし、まだそれは動作していない、それはコース表の '数学 'の2つのレコードを挿入しています。 –
が必要な場合は、まずすべてのコースを保存してから、学生に割り当てて生徒を保存します。 –
最初にすべての「コース」を保存する必要はありません。両方の「数学」コースに同じ目的を持つことが必要でした。私の間違いは、私は '新しいコース(「数学」)を2回していた。 –