#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. Спасибо. Но в контроллере. Использование атрибута модели. Возможно, мне придется создать обернутый класс, поскольку у меня будет два объекта, поддерживающих форму.