【问题标题】:Multiple representations of the same entity are being merged同一实体的多个表示正在合并
【发布时间】: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.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);

我怎样才能摆脱这个错误?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我的第一个 for 循环有什么问题。如果我使用上面的 for 循环,即使没有重复的 language_id 它总是给我提到的错误。
    • items中的重复只是bug的一种可能,另一个是当你从db加载对象时你已经有了关联。
    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2019-06-08
    • 1970-01-01
    • 2020-04-11
    • 2021-11-01
    • 2019-01-31
    相关资源
    最近更新 更多