在JPA 2.0中捕获约束违规

时间:2010-05-23 17:59:15

标签: java jpa try-catch eclipselink unique-constraint

考虑以下实体类,例如,与EclipseLink 2.0.2一起使用 - 其中link属性不是主键,但仍然是唯一的。

@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的特定值 - 这显然会导致大量多余的查询。

2 个答案:

答案 0 :(得分:5)

  

当我为link属性插入重复值的记录时,EclipseLink不会抛出EntityExistsException

是的,在这种情况下,JPA提供商不应该抛出EntityExistException,除了主键之外,你不会得到EntityExistException

  

(...)但抛出DatabaseException,并显示消息说明违反了唯一约束。

这是来自EclipseLink的 WRONG ,JPA提供者应该抛出PersistenceException或子类,但肯定不是o.e.p.e.DatabaseException之类的特定异常。这是一个错误,应该像我在previous answer中提到的那样报告。

  

这似乎不太有用,因为没有一种简单的,独立于数据库的方法来捕获此异常。处理这个问题的建议方法是什么?

与上述答案相同,请参阅我的previous answer

答案 1 :(得分:2)

他们在JPA中没有ConstraintViolationException太糟糕了。我已经创建了一个辅助方法来确定PersistenceException是否是给定类的约束违例 - 它只是休眠。我想有一种方法可以使用其他实现来实现它。

protected Boolean isUniqueConstraintViolation(PersistenceException ex, Class entity) {

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

    return false;
}