Hibernate Многие-ко-многим, объединить существующую строку - PullRequest
0 голосов
/ 28 октября 2011

Я попробовал пример проекта об отношениях Hibernate «многие ко многим», загруженного с http://www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html Затем у меня возникла проблема с дублированием того же студента, когда я собирался добавить курс к существующему студенту, но я решил его с помощьюпредыдущий вопрос задан здесь.

Hibernate Многие-ко-многим, дублирует одну и ту же запись

Так что теперь мой код выглядит так:

    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);

И там есть тот же ученик Эсвар.

    +------------+--------------+
    | 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<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;
}

}

Я действительно ценю вашепомощь.

1 Ответ

1 голос
/ 28 октября 2011

вам просто нужно выполнить следующее в вашем коде, и я надеюсь, что он начнет работать DB db = новая база данных ();

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

    session.saveOrUpdate(eswar);

В настоящее время вы получаете студента из базы данных и устанавливаете для его курсов новый набор, этот новый набор не содержит старого старого курса ........ поэтому, когда вы вызываете методSaveOrUpdate (), тот же ученик получает обновление с новым SET, но этот новый SET не содержит старую запись ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...