Объединяются несколько представлений одного и того же объекта

#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. Дублирование в элементах — это просто возможность ошибки, другая заключается в том, что у вас уже есть ассоциация при загрузке объекта из базы данных.