正在合并同一实体的多个表示

时间:2016-10-03 17:46:47

标签: java hibernate

我跟随两个具有多对多关系和级联类型合并的实体。

@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.E​​LException: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);

如何摆脱这个错误?

1 个答案:

答案 0 :(得分:0)

你有一个具有重复语言ID的数组,你应该避免这种情况。

要避免此问题,您只需检查语言列表是否已包含语言对象。

if (!stammdaten.getLanguages().contains(selectedLanguage)) {
    stammdaten.getLanguages().add(selectedLanguage);
}

如果语言对象的 equals()按您的意愿工作,则此方法有效。