在JPA 2.0中捕获约束违规

wen*_*wen 11 java jpa try-catch unique-constraint eclipselink

考虑以下实体类,例如,与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
}
Run Code Online (Sandbox Code Playgroud)

当我插入具有该link属性的重复值的记录时,EclipseLink不会抛出a EntityExistsException,而是抛出a DatabaseException,并显示消息,说明违反了唯一约束.

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

我考虑过的一些事情是:

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

Pas*_*ent 5

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

是的,并且JPA提供程序不应该EntityExistException在这种情况下抛出,EntityExistException除了主键之外你不会得到别的东西.

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

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

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

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