2016-10-03 7 views
0

多対多リレーションとカスケード型マージを持つ次の2つのエンティティがあります。同じエンティティの複数の表現がマージされています

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

とアイテムのサイズがより1以上であれば、私は

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

としてStammdatenを保存し、その後、私はこのエラー

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]]

、私は次のコード

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

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

でループについては、上記を変更する場合、これは正常に動作します:独立しました。しかし、同じ言語IDを持つ2つの言語オブジェクトがある場合、同じエラーが発生します。したがって、このコードでも同じエラーが発生します。

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

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

どうすればこのエラーを取り除くことができますか?

答えて

0

言語IDが重複している配列があります。これは避けてください。

この問題を回避するには、言語リストに既に言語オブジェクトが含まれているかどうかを確認するだけです。あなたが好きな言語オブジェクトののequals()が動作するかどうか

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

これは動作します。

+0

私の最初のforループで何が問題ですか。上記のforループを使用しても、重複したlanguage_idがなくても、それは常に私に言及されたエラーを与えます。 – asdlfkjlkj

+0

* items *の重複はバグの可能性に過ぎず、もう一つはdbからオブジェクトをロードするときにすでに関連があるということです。 –

関連する問題