2010-05-23 90 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; 
}