【发布时间】:2016-10-03 17:46:47
【问题描述】:
我有以下两个具有多对多关系和级联类型合并的实体。
@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);
如果 item size 大于 1,则会出现此错误
javax.el.ELException: org.springframework.dao.InvalidDataAccessApiUsageException: 同一实体 [com.example.outgoing.Entity.Language#1] 的多个表示正在合并。分离:[com.example.outgoing.Entity.Language@6c0d5d52];分离:[com.example.outgoing.Entity.Language@39afc789];嵌套异常是 java.lang.IllegalStateException:正在合并同一实体 [com.example.outgoing.Entity.Language#1] 的多个表示。分离:[com.example.outgoing.Entity.Language@6c0d5d52];分离:[com.example.outgoing.Entity.Language@39afc789]
再次,如果我使用以下代码更改上述 for 循环
Language selectedLanguage = languageService.findById(1);
stammdaten.getLanguages().add(selectedLanguage);
Language selectedLanguage1 = languageService.findById(2);
stammdaten.getLanguages().add(selectedLanguage1);
这很好用。但是,如果我有 2 个具有相同语言 ID 的语言对象,我也会得到同样的错误。所以这段代码也给出了同样的错误。
Language selectedLanguage1 = languageService.findById(Integer.parseInt ("2"));
stammdaten.getLanguages().add(selectedLanguage1);
Language selectedLanguage2 = languageService.findById(Integer.parseInt ("2"));
stammdaten.getLanguages().add(selectedLanguage2);
我怎样才能摆脱这个错误?
【问题讨论】: