考虑以下实体类,例如,与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
的特定值 - 这显然会导致大量多余的查询。答案 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;
}