Автоматическое обновление таблиц «многие ко многим» с уникальными столбцами - PullRequest
0 голосов
/ 07 января 2012

Пока я писал этот вопрос, я нашел решение, но все равно собираюсь спросить.Может быть, есть более простой способ сделать это.

Я хочу сделать таблицу ассоциаций из двух таблиц.Давайте назовем их студентом и курсом.Оба имеют идентификатор и уникальное имя.
Мне нужна третья таблица (student_id to course_id), которая автоматически обновляется, когда я вставляю студента, который посещает курсы.

Это почти следующий пример, который янайдено здесь: Hibernate «многие ко многим» с аннотациями , но я изменил аннотацию @Table на
@Table(name = "STUDENT", uniqueConstraints = {@UniqueConstraint(columnNames = {"STUDENT_NAME" })})
То же самое для курсов.

Я вставляю первого студента

Set<Course> courses = new HashSet<Course>();
courses.add("Math); courses.add("Science");

Student alice = new Student("alice", courses);

Приходит еще один студент

Student bob= new Student("bob", courses);

И происходит сбой, потому что курсы естествознания и математики уже существуют в таблицах курсов, и таблица student_to_course не будет обновлена.

Что я знаю, так это запросил курс с таким именем в таблице курсов.Если он есть, я добавляю его в курс студентов, в противном случае добавляю новый.

List<Course> list = session.createCriteria(Course.class)
            .add(Restrictions.eq("courseName", "Maths")).list();
if (list.size() > 0){
   courses.add(list.get(0));
}
else {
    courses.add(new Course("Maths"));           
}
s.setCourses(courses);

Так что это работает, но я думаю, что должен быть лучший способ сделать это.
Есть ли способсказать hibernate добавить курсы к студенту из таблицы курсов, если в таблице уже есть курс с таким именем?

1 Ответ

0 голосов
/ 07 января 2012

Вы делаете это правильно, и другого пути нет.

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

Метод будет выглядеть следующим образом:

public Student createStudent(String studentName, Set<Long> courseIds)

или как это:

public Student createStudent(String studentName, Set<Course> courses)

В первом случае самый простой и быстрый способ получить набор курсов - это циклически проходить по идентификаторам курсов и вызывать session.load(courseId), чтобы получить ссылку на курс, даже не обращаясь к базе данных.

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