2013-03-31 27 views
1

我有一個實體A具有獨特的領域,該領域基本上定義的實體處理,這意味着它是相等的,那麼則實體也完全一樣。JPA(休眠)+春季:具有獨特的違反約束

的第二點是,它絕不例外讓說如果違反約束。意思是完全預計用戶將嘗試輸入重複。

在重複的情況下,應用程序應該默默的選擇了已經存在的實體。我的問題是現在我應該做什麼,特別是在保存包含As列表的實體時。

  • 剛剛捕獲異常,並從那裏去

我不知道這是很容易儘可能DataIntegrityViolationException不成立像什麼實體的情況下受到影響的級聯堅持任何容易處理的信息!

  • 檢查之前保存(堅持),並與現有的更換提交的實體(即有一個ID集)

我喜歡這更然而,有一個相當大的開銷,因爲那時有可能有多個選擇(存在檢查)之前插入每個插入。

有什麼更好的辦法?

回答

3

對於選項1)您正在尋找類似http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html的東西,但在JPA/hibernate級別上對於該命令沒有任何等效(我認爲這不是ANSI SQL)。試圖捕捉異常並「從那裏出發」是一個糟糕的主意,因爲交易將會回滾,並且您將不得不經歷許多問題才能使其表現得像您想要的那樣。對於選項2),我相信它是標準的JPA/Hibernate練習,你不僅需要從DB中查詢和加載實體,還可以將你的修改從臨時對象複製到加載的對象,然後讓JPA保存您的更新。這很麻煩,你必須小心你所依賴的級聯操作,因爲你可能需要避免用瞬時操作覆蓋持久對象。這是JPA/Hibernate沒有好的解決方案的複雜問題。

+0

關於1)我可以做同樣的檢查,作爲2)異常發生後。然後,我可以用我們自己的例外情況來詳細說明違反了哪個唯一約束條件。我覺得這樣比較好?因爲檢查僅在需要時完成。 –

+0

這可能會工作,但在這種情況下,你沒有保存任何東西到數據庫的情況下重複的ID,我雖然你想執行更新。 – ilcavero