У меня есть два класса: Student
and Subject
:
Студент
@Entity
@Table(name = "students")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "full_name")
private String fullName;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "students")
private Set<Subject> subject;
//Getters & setters
}
Предмет
@Entity
@Table(name = "subjects")
public class Subject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "subject_name")
private String name;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Student> students;
//Getters & setters
}
Когда я пытаюсь сохранить студента, зарегистрированного более чем одним субъектом, я не получаю никаких записей в JoinTable.
Мой код для сохранения участников:
Subject subject = new Subject();
subject.setName("JAVA");
Subject subject2 = new Subject();
subject2.setName("C");
Subject subject3 = new Subject();
subject3.setName("C++");
Student student = new Student();
student.setFullName("dibya");
Set<Subject> subjects = new HashSet<>();
subjects.add(subject2);
subjects.add(subject);
subjects.add(subject3);
student.setSubject(subjects);
session.saveOrUpdate(student);
Скажите, пожалуйста, где я делаю неправильно.
Нашел решение моей проблемы.
Это было не с конфигурацией. С помощью всего лишь mappedBy
атрибутом ManyToMany
отношение может быть выполнено.
В моей программе я добавил session.saveOrUpdate(subject);
после сохранения сохранения студентов.
Это решило мою проблему. :)
Ваш случай может падать в смешение JPA и Hibernate. Попробуйте аннотировать свой @ManyToMany
с помощью дополнительных
@Cascade({CascadeType.SAVE_UPDATE})
вы также можете обратиться к этим двум ссылкам, чтобы проверить, действительно ли это ваш случай:
Отношение "многие ко многим" моделируется как таблица соединений. Это таблица с 2 столбцами, оба являются внешними ключами к таблицам repationhip (Student и Subject в вашем случае).
В Hibernate, если вы используете @ManyToMany
вам нужно либо @JoinTable
либо @JoinColumn
определить отношения. После этого ваше обновление будет работать.
Видеть
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch07.html
а также
EDIT: Применительно к вашему коду он должен выглядеть (UNTESTED):
Ученик:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "student_id")
private int id;
....
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "students_subject", joinColumns = { @JoinColumn(name = "student_id") }, inverseJoinColumns = { @JoinColumn(name = "subject_id") })
private Set<Subject> subject;
В теме
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "subject_id")
private int id;
...
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "students_subject", joinColumns = { @JoinColumn(name = "subject_id") }, inverseJoinColumns = { @JoinColumn(name = "student_id") })
private Set<Student> students;
students_subjects
и subjects_students
. С пустыми записями;
session.saveOrUpdate(subject);