2016-10-03 90 views
0

我有以下两个实体,具有多对多关系和级联类型合并。同一实体的多个表示正在合并

@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]的多个表示。分开:[[email protected]];分开:[[email protected]];嵌套异常是java.lang.IllegalStateException:正在合并同一个实体[com.example.outgoing.Entity.Language#1]的多个表示。分开:[[email protected]];分离:[[email protected]]

同样,如果我改变上述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); 

我该如何摆脱这个错误?

回答

0

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

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

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

这工作如果语言对象的的equals()工作,只要你想。

+0

我的第一个循环出了什么问题。如果我使用上面的for循环,并且即使没有重复的language_id,它总会给我提到的错误。 – asdlfkjlkj

+0

* items *中的重复只是该bug的可能性,另一个是当您从db中加载对象时,您已经拥有关联。 –

相关问题