2016-08-09 5 views
3

SOから検索しましたが、似たようなケースはないようです。spring jpa - 同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられていた

エンティティ国が単一のフィールドで、あります:

product.setCountry(new Country("lv")) 
:経由国を設定するとき

public class Product { 

    @ManyToOne(fetch = EAGER, cascade = ALL) 
    @JoinColumn(name = "COUNTRY_CODE") 
    private Country country; 
} 

public class Country { 

    @Id 
    @Column(name = "COUNTRY_CODE") 
    private String countryCode; 

    public boolean equals(Object o) {} 

    public int hashCode() { } 
} 

そして、これらのエントリのコレクションを持っている別のクラス

私はそれが保存されていると仮定します。

しかし、代わりに、私は例外を取得 - 同じ識別子の値を持つ異なるオブジェクトがすでに来て、あなたがこの問題の種類を提供しているとして、多くのコードを見てセッション

+0

スタックトレースを表示できますか? – ryekayo

答えて

8

に関連付けられたオブジェクトが参照されていないため、同じJavaオブジェクトインスタンス。これは、同じセッションオブジェクトを読み取りのために使用した場合に発生します。&書き込みまたは同じオブジェクトを単一セッションに入れている場合。彼らはデータベースの同じ行(つまり、同じ主キー)を参照していますが、それらは異なるコピーです。何が起きているのかは、エンティティを管理しているセッションが、どのJavaオブジェクトが対応しているか同じ主キーを持つ行

下記のコードを試してみることをおすすめします。

1- Just set cascade to MERGE, that should work for you. 

     OR 

2- @GeneratedValue(strategy = GenerationType.SEQUENCE) OR Other GenerationType 
+1

これは機能しました - @ManyToOne(カスケード= {PERSIST、MERGE}) – sandris

関連する問題