我有一个带有多字段唯一约束的持久类。但是定义的唯一约束对我来说是不够的,因为在其中一个字段不相等但相似的值也是唯一的。
我实现了一个checkUniqueConstraint
方法。在 DAO 类的添加和更新方法中,我checkUniqueConstraint
在添加或更新持久对象之前调用。
checkUniqueConstraint
方法只需运行一个 SELECT 查询来查找类似于输入的对象并在找到一些对象时抛出一个检查异常。
public class PersistClassDao {
public void checkUniqueConstraint(PersistClass persistObject) throws DuplicateEntityException {
/**
* creating a query string that find persist objects similar to input parameter.
**/
try {
PersistClass result = (PersistClass) query.uniqueResult();
if(result != null && (persistObject.getId() == null || persistObject.getId() != result.getId())){
throw new DuplicateEntityException(exceptionMessage, "");
}
} catch (NonUniqueResultException e) {
throw new DuplicateEntityException(exceptionMessage);
}
}
public long add(/* field of new persistObject*/) throws DuplicateEntityException {
//creates a transisent instance of persistObject
PersistClass newObject = getPersistClass(/* field of new persistObject*/);
checkUniqueConstraint(newObject);
try {
getCurrentSession().save(newObject);
getCurrentSession().flush();
return newObject.getId();
} catch (ConstraintViolationException e) {
throw new DuplicateEntityException();
}
}
我有一个用于添加的事务服务方法和另一个用于更新的方法。
当我运行我的测试时
- 首先添加2个persistObjects(通过服务方法)。
- 然后更新其中一个(通过服务方法),使其与另一个相似
- 我希望抛出 DuplicatException
但实际上是 org.hibernate.exception。通过 checkUniqueConstraint 抛出 ConstraintViolationException!
为什么?