2010-05-23 87 views
11

考慮以下實體類,以用於,例如,的EclipseLink 2.0.2 - 其中所述link屬性不是主鍵,但獨特nontheless。捕捉違反約束在JPA 2.0

@Entity 
public class Profile { 
    @Id 
    private Long id; 

    @Column(unique = true) 
    private String link; 

    // Some more attributes and getter and setter methods 
} 

當我插入的記錄與該link屬性的重複值,的EclipseLink不會引發EntityExistsException,而是拋出一個DatabaseException,該消息解釋說,唯一約束被侵犯。

這似乎不是非常有用,因爲不會有簡單的,與數據庫無關的方法來捕獲此異常。建議如何處理這個問題?

,我認爲

有幾件事情是:

  • 檢查錯誤代碼的DatabaseException - 我擔心這種錯誤代碼,雖然是數據庫的本地錯誤代碼;
  • 檢查一個Profile的具有用於預先link特定值的存在 - 這顯然會導致多餘的查詢大量的。
+0

我已經提交一個bug針對此問題。請爲此投票,以便我們解決此問題:https://bugs.eclipse.org/bugs/show_bug.cgi?id=375745 – sdoca 2012-03-30 17:01:58

回答

5

當我插入記錄與鏈接屬性重複值,的EclipseLink不會引發EntityExistsException

是,和JPA提供商不應該扔在這種情況下的EntityExistException,您不會在主鍵以外的地方獲得EntityExistException

(...)但拋出一個DatabaseException,並解釋唯一約束被違反的消息。

這是非常的EclipseLink WRONG ,JPA提供應該拋出一個PersistenceException或子類,但肯定不是一個特定的異常像o.e.p.e.DatabaseException。這是一個錯誤,應該按照我在previous answer中已經提到的那樣報告。

這似乎並不是非常有用,因爲不會有簡單的,與數據庫無關的方法來捕獲此異常。建議如何處理這個問題?

與上述相同的答案,請參閱我的previous answer

+0

由於您在此提到了EclipseLink:您是否知道其他JPA提供者的行爲正確? – Hank 2010-09-29 10:31:47

+0

@Hank也許這個問題在最近的版本中是固定的,不能說。但據我所知,在這種情況下,Hibernate會拋出一個'PersistenceException'。 – 2010-09-29 15:31:55

2

這太糟糕了,他們在JPA中沒有ConstraintViolationException。我創建了一個輔助方法來確定PersistenceException是否違反給定類的約束 - 它只是休眠。我想有一種使用其他實現的方法。

protected Boolean isUniqueConstraintViolation(PersistenceException ex, Class entity) { 

    if (((NonUniqueObjectException)ex.getCause()).getEntityName().equals(entity.getName())) { 
     return true; 
    } 

    return false; 
}