2010-05-07 68 views
4

我們有一個應用程序需要在創建時檢測某些字段中的重複項。我們使用Hibernate作爲持久層,並使用Spring的HibernateTemplate。我的問題是,在創建之前是否先爲該項目進行前期查找,或嘗試捕獲DataIntegrityViolation異常,然後檢查這是否由重複項導致。使用Spring Hibernate模板檢測重複項的最佳方法

回答

9

這取決於是否有重複是特殊情況還是業務邏輯情況。
例如,檢查登記時唯一的電子郵件/用戶名是業務邏輯的情況下和檢查應該試圖插入

如果您需要指出哪些字段完全未能通過唯一約束之前完成,則最好事先檢查一下,而不是抓住例外。捕捉異常並不能給你重要的細節 - 哪個領域失敗了。

有一些方法可以根據例外情況獲取這些信息,但它非常繁瑣且是數據庫特定的(查找數據庫中的約束名稱(特定於數據庫),獲取應用的字段,匹配與實體屬性的字段)

1

我絕對去Bozho答案。我認爲這正是關鍵。
我目前正在研究的項目中存在類似的問題。我們在基於過濾器的多個服務器之間共享信息,並且可能存在收到的對象已經添加到數據庫中的情況,因此會發生PK異常。

在我們的案例中,這些PK衝突非常罕見,所以我們認爲這種情況是例外。我們也在使用spring和hibernate,爲了分離這些問題,並且由於Springs Transaction-Definitions,我們使用AOP來捕獲特定的DataIntegrity-Exception並重新運行Transaction,以根據需求進行所需的完整性檢查。
如果您需要使用ExceptionHandlerAdvice的幫助,我可以詳細說明這一點。

4

最好檢查數據庫中是否存在數據。檢查數據庫中是否存在數據的一種簡單方法是讓您的類實現休眠LifeCyle api。 Hibernate允許您在保存之前但在身份與bean關聯之後執行驗證行爲。如果某些邏輯被違反或失敗,則可以否決保存操作。

public class Bean extends Serializable implements org.hibernate.classic.LifeCycle { 
     public boolean onSave(Session s) { 
      Query query = session.createQuery(from Bean b where b.field=:field"); 
      query.setParameters("field", this.field); 
      @SuppressWarnings("unchecked") 
      List<Bean> beans = query.list(); 
      if (beans != null && !beans.isEmpty()) { 
       // This does not save the identity. 
       return VETO; 
      } 
      return NO_VETO; 
     } 
} 
相關問題