2012-05-05 11 views
0

クラスAにはクラスBに対するOneToMany関係があります。クラスBはid、firstName、lastNameなどのいくつかの属性のみで構成されます。 idはUUIDによって生成されます。 Aの非常に多くのインスタンスが、firstNameとlastNameの値に同じ値を加えたBのインスタンスを参照し、Bのインスタンスの値が変更される可能性は非常に低いためです。だから私は重複を避け、他のパラメータが同じであれば、Aの参照インスタンスをBの同じインスタンス(データベース内)にすることにしました。JPA、OneToManyでEntityを保持します。Manyは既に存在します。

例:

b: "John Doe" 
a: a1 ("Foo Bar", "John Doe"), a2 ("John Doe", "Alan Smith"). 

これを達成するために、私はいつもそうした場合、新たなBがAに追加された場合に非常に同じパラメータを持つ既存のレコードのデータベースをチェックし、私はIDを上書きしますそのBのインスタンスをデータベースのものと入れ替え、それをAに追加します。

ここに私の問題があります。すべてが正常に動作しているが、私は、私は手動でBのIDを変更Aを持続している場合、それは既にデータベース内の既存のBと同じIDを持っていることを私は例外取得しますので:

Caused by: org.hibernate.exception.ConstraintViolationException: 
Duplicate entry '2cfa1412-5f64-4a9c-b55c-f7db1148bef9' for key 'PRIMARY' 

をだから私の質問は次のとおりです:

  • 例外を無視することなくこの問題を解決するにはどうすればよいですか?
  • これは私の必要性に合った良い方法ですか?

敬具すべての

+1

私はあなたが多対について話していると考えています1対多の関係を使用し、1対多を使用します。その場合、まずこの問題を修正してください。 –

答えて

1

まず、あなたはOneToManyが、多対多を持っていません。

今、あなたの問題を解決するために、あなたのdetachedBに添付BのIDを割り当てますが、取り付けられた1つによって切り離さBに代わるものではありません。

Set<B> bs = new HashSet<B>(a.getBs()); // copy the list of Bs 
a.getBs().clear(); 
for (B b : bs) { 
    B existingB = searchBWithSameValuesAs(b); 
    if (existingB != null) { 
     a.getBs().add(existingB); 
    } 
    else { 
     em.persist(b); 
     a.getBs().add(b); 
    } 
} 
+0

ありがとうございました。あなたはどちらも正しい。それはちょうどManyToMany(だから愚か:)でなければならず、私はIDだけでなく、すべてを置き換えなければならなかった。 :) –

関連する問題