11

考虑以下实体类,例如与 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 不会抛出 a EntityExistsException,而是抛出 a DatabaseException,并显示消息说明违反了唯一约束。

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

我考虑过的几件事是:

  • 检查错误代码DatabaseException- 我担心这个错误代码是数据库的本机错误代码;
  • Profile预先检查具有特定值的 a 的存在link- 这显然会导致大量多余的查询。
4

2 回答 2

5

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

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

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

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

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

与上面的答案相同,请参阅我之前的答案

于 2010-05-23T20:53:03.870 回答
2

太糟糕了,他们在 JPA 中没有 ConstraintViolationException。我创建了一个辅助方法来确定 PersistenceException 是否是给定类的约束违规——尽管它只是休眠状态。我想有一种方法可以使用其他实现来做到这一点。

protected Boolean isUniqueConstraintViolation(PersistenceException ex, Class entity) {

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

    return false;
}
于 2011-01-22T06:14:56.557 回答