2016-10-03 93 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中加載對象時,您已經擁有關聯。 –

相關問題