2012-05-05 96 views
0

我有這樣的情況,我有一個類A與類B具有OneToMany關係。類B只包含一些屬性,如id,firstName和lastName。該ID是通過UUID生成的。由於非常多的A實例很可能會引用具有相同的firstName和lastName值的B的實例,並且B實例中的那些值不太可能改變。所以我決定避免重複,並讓A的參考實例與B中相同的實例(在數據庫中)相同(如果其他參數相同)。JPA,堅持OneToMany的實體,其中一些已經存在

例子:

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

要做到這一點,我總是檢查與非常相同的參數已經存在的記錄的數據庫,如果一個新的B加入A.如果是的話,我就重寫ID B的實例與來自數據庫的實例相關聯,然後將其添加到A.

現在來了我的問題。一切工作正常,但如果我堅持一個A,我手動改變了B的ID,以便它具有相同的ID已經在數據庫中存在的B I會得到一個例外:

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

所以我問題是:

  • 如何解決此問題而不忽略異常?
  • 這是一個適合我需要的好方法嗎?

問候

+1

我相信你是在談論一個多對一一對多的關係,並使用一對多。如果是這種情況,首先解決這個問題。 –

回答

1

首先,你沒有一個一對多,而是多對多。

現在,爲了解決您的問題,不附加B的ID分配給您的detachedB,但替代由附加一個分離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。 :) –