多対多リレーションとカスケード型マージを持つ次の2つのエンティティがあります。同じエンティティの複数の表現がマージされています
@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>();
}
とアイテムのサイズがより1以上であれば、私は
@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);
としてStammdatenを保存し、その後、私はこのエラー
javax.el.ELException取得:org.springframeworkを。 dao.InvalidDataAccessApiUsageException:同じエンティティ[com.example.outgoing.Entity.Language#1]の複数の表現がマージされています。分離:[[email protected]];デタッチ:[[email protected]];ネストされた例外はjava.lang.IllegalStateExceptionです:同じエンティティ[com.example.outgoing.Entity.Language#1]の複数の表現がマージされています。分離:[[email protected]];もう一度[[email protected]]
、私は次のコード
Language selectedLanguage = languageService.findById(1);
stammdaten.getLanguages().add(selectedLanguage);
Language selectedLanguage1 = languageService.findById(2);
stammdaten.getLanguages().add(selectedLanguage1);
でループについては、上記を変更する場合、これは正常に動作します:独立しました。しかし、同じ言語IDを持つ2つの言語オブジェクトがある場合、同じエラーが発生します。したがって、このコードでも同じエラーが発生します。
Language selectedLanguage1 = languageService.findById(Integer.parseInt ("2"));
stammdaten.getLanguages().add(selectedLanguage1);
Language selectedLanguage2 = languageService.findById(Integer.parseInt ("2"));
stammdaten.getLanguages().add(selectedLanguage2);
どうすればこのエラーを取り除くことができますか?
私の最初のforループで何が問題ですか。上記のforループを使用しても、重複したlanguage_idがなくても、それは常に私に言及されたエラーを与えます。 – asdlfkjlkj
* items *の重複はバグの可能性に過ぎず、もう一つはdbからオブジェクトをロードするときにすでに関連があるということです。 –