JPA: как сохранить отношение «многие ко многим»

#java #hibernate #jpa

#java #спящий режим #jpa

Вопрос:

У меня есть эти 2 объекта с отношениями «многие ко многим».

 @Entity
public class User {

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<User> users = new ArrayList<User>();
}

@Entity
public class Language {
    @ManyToMany(mappedBy = "languages")
    private List<User> users = new ArrayList<User>();
}
  

У меня уже есть 20 языков, сохраненных в моей языковой таблице. Теперь я хочу создать пользователя и связать этого пользователя с первым языком в языковой таблице. Итак, я сделал что-то вроде этого

     Language selectedLanguage = languageService.findById(1);
    stammdaten.getLanguages().add(selectedLanguage);
    stammdatenService.save(stammdaten);
  

Но это дает мне ошибку org.hibernate.PersistentObjectException: detached entity passed to persist: com.example.outgoing.Entity.Language . Итак, как я могу сохранить это отношение «многие ко многим». Здесь следует отметить одну вещь: я не хочу добавлять новый язык. Я хочу добавить нового пользователя с уже созданными языками.

Комментарии:

1. Я думаю, что в вашем коде что-то не так… Вместо этого у объекта User должен быть список <Язык>?

Ответ №1:

Заменить CascadeType.ALL на CascadeType.MERGE .

Кроме того, добавьте сеттеры для обоих объектов.

Комментарии:

1. ваше решение работает, но я не понимаю, почему. Я думал CascadeType.ALL , что охватывает все, например, слияние, сохранение и т. Д

Ответ №2:

Я определяю отношение «многие ко многим» через аннотацию @ManyToMany в JPA.

Я написал пример кода для вставки.

Я думаю, это изображение поможет вам понять

введите описание изображения здесь

Комментарии:

1. Что, если вы хотите сделать это с помощью контроллера?

2. Вам нужно написать сервис для уровня DAO, а затем внедрить сервис в уровень контроллера.

3. ОК. Спасибо! Но если я хочу извлечь объект из представления вместо жесткого кодирования курса (Course course = … Курс («Jee») и студент (Студент student = … Студент («Али»)) из той же формы. Могу ли я сделать это за один сеанс?

4. общедоступная пустая вставка studentandcoursemanytomany( Student[] students, Course[] courses ) { для ( Курс, курс: курсы) { em.persist( курс); для ( Студент, студент: студенты ) { student.addCourse( курс); em.persist( студент); } } }

5. Спасибо. Но в контроллере. Использование атрибута модели. Возможно, мне придется создать обернутый класс, поскольку у меня будет два объекта, поддерживающих форму.