简体   繁体   中英

Multiple representations of the same entity are being merged

I have following two entity with many to many relation and cascade type merge.

@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>();
}

and I save the Stammdaten as

@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);

If item size more is more than 1, then I get this error

javax.el.ELException: org.springframework.dao.InvalidDataAccessApiUsageException: Multiple representations of the same entity [com.example.outgoing.Entity.Language#1] are being merged. Detached: [com.example.outgoing.Entity.Language@6c0d5d52]; Detached: [com.example.outgoing.Entity.Language@39afc789]; nested exception is java.lang.IllegalStateException: Multiple representations of the same entity [com.example.outgoing.Entity.Language#1] are being merged. Detached: [com.example.outgoing.Entity.Language@6c0d5d52]; Detached: [com.example.outgoing.Entity.Language@39afc789]

Again, if I change the above for loop with following code

Language selectedLanguage = languageService.findById(1);
stammdaten.getLanguages().add(selectedLanguage);

Language selectedLanguage1 = languageService.findById(2);
stammdaten.getLanguages().add(selectedLanguage1);

This works fine. But if I have 2 language object with same language id, I also get same error. So this code also gives same error.

Language selectedLanguage1 = languageService.findById(Integer.parseInt ("2"));
stammdaten.getLanguages().add(selectedLanguage1);

Language selectedLanguage2 = languageService.findById(Integer.parseInt ("2"));
stammdaten.getLanguages().add(selectedLanguage2);

How can I get rid of this error?

You have an array with duplicated language id, and you should avoid this.

To avoid this problem you just have to check if your language list already contain the language object.

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

This works if the equals() of the language object works as you want.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM