Как обновить JoinTable в спящем режиме

1

У меня есть два класса: 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);

Скажите, пожалуйста, где я делаю неправильно.

Теги:
hibernate
jpa

3 ответа

0
Лучший ответ

Нашел решение моей проблемы.

Это было не с конфигурацией. С помощью всего лишь mappedBy атрибутом ManyToMany отношение может быть выполнено.

В моей программе я добавил session.saveOrUpdate(subject); после сохранения сохранения студентов.

Это решило мою проблему. :)

  • 0
    Если вы сделаете правильное отображение, вы можете избежать session.saveOrUpdate(subject);
0

Ваш случай может падать в смешение JPA и Hibernate. Попробуйте аннотировать свой @ManyToMany с помощью дополнительных

@Cascade({CascadeType.SAVE_UPDATE})

вы также можете обратиться к этим двум ссылкам, чтобы проверить, действительно ли это ваш случай:

0

Отношение "многие ко многим" моделируется как таблица соединений. Это таблица с 2 столбцами, оба являются внешними ключами к таблицам repationhip (Student и Subject в вашем случае).

В Hibernate, если вы используете @ManyToMany вам нужно либо @JoinTable либо @JoinColumn определить отношения. После этого ваше обновление будет работать.

Видеть

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch07.html

а также

http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.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;
  • 0
    Не могли бы вы опубликовать решение для этого? Я пытался использовать JoinTable. Он создает две таблицы: students_subjects и subjects_students . С пустыми записями;
  • 0
    Нет, все еще не работает. Ошибка не выдана, но таблица ссылок не обновляется.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню