#java #hibernate
#java #спящий режим
Вопрос:
У меня есть следующие два объекта с отношением «многие ко многим» и слиянием каскадного типа.
@Entity
public class Stammdaten {
@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
private List<Language> languages = new ArrayList<Language>();
}
@Entity
public class Language {
@ManyToMany(mappedBy = "languages")
private List<Stammdaten> stammdatens = new ArrayList<Stammdaten>();
}
и я сохраняю Stammdaten как
@ManagedProperty("#{stammdatenService}")
StammdatenService stammdatenService;
private List<Language> languages;
for (Integer language_id : items) {
Language selectedLanguage = languageService.findById(language_id);
stammdaten.getLanguages().add(selectedLanguage);
}
stammdatenService.save(stammdaten);
Если размер элемента больше больше 1, то я получаю эту ошибку
исключение javax.el.ELException: org.springframework.dao.InvalidDataAccessApiUsageException: несколько представлений одной и той же сущности [com.example.исходящий.Сущность.Язык # 1] объединяется. Отсоединено: [com.example.исходящий.Сущность.Язык @6c0d5d52]; Отсоединен: [com.example.исходящий.Сущность.Язык @39afc789]; вложенным исключением является java.lang.Исключение IllegalStateException: несколько представлений одного и того же объекта [com.example.исходящий.Сущность.Язык # 1] объединяется. Отсоединено: [com.example.исходящий.Сущность.Язык @6c0d5d52]; Отсоединен: [com.example.исходящий.Сущность.Язык@39afc789]
Опять же, если я изменю приведенный выше цикл for следующим кодом
Language selectedLanguage = languageService.findById(1);
stammdaten.getLanguages().add(selectedLanguage);
Language selectedLanguage1 = languageService.findById(2);
stammdaten.getLanguages().add(selectedLanguage1);
Это работает нормально. Но если у меня есть 2 языковых объекта с одинаковым идентификатором языка, я также получаю ту же ошибку. Таким образом, этот код также выдает ту же ошибку.
Language selectedLanguage1 = languageService.findById(Integer.parseInt ("2"));
stammdaten.getLanguages().add(selectedLanguage1);
Language selectedLanguage2 = languageService.findById(Integer.parseInt ("2"));
stammdaten.getLanguages().add(selectedLanguage2);
Как я могу избавиться от этой ошибки?
Ответ №1:
У вас есть массив с дублированным идентификатором языка, и вам следует избегать этого.
Чтобы избежать этой проблемы, вам просто нужно проверить, содержит ли ваш список языков языковой объект.
if (!stammdaten.getLanguages().contains(selectedLanguage)) {
stammdaten.getLanguages().add(selectedLanguage);
}
Это работает, если equals() языкового объекта работает так, как вы хотите.
Комментарии:
1. Что не так с моим первым циклом for. Если я использую приведенный выше цикл for и даже нет дублированного language_id, это всегда выдает мне указанную ошибку.
2. Дублирование в элементах — это просто возможность ошибки, другая заключается в том, что у вас уже есть ассоциация при загрузке объекта из базы данных.