我有一个持有多字段唯一约束的类。但是对于我来说,定义的唯一约束是不够的,因为一个领域不相等但相似的值也是唯一的。关于SELECT查询的Hibernate ConstraintViolationException
我执行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();
}
}
我有一个transactionl服务mehod添加和另一个更新。
当我运行我的测试
- 首先加2个persistObjects(通过服务方法)。
- 然后更新一个(通过服务方法)他们,使类似于其他
- 我希望DuplicatException抛出
但真的org.hibernate.exception。通过checkUniqueConstraint抛出ConstraintViolationException!
为什么?
向我们显示导致异常的代码和异常堆栈跟踪。你说你**通过服务方法更新**一个对象,但服务方法**添加**一个新对象。 –
很难说这个问题是什么,但从我的角度来看,你正在努力实现一些不可取的事情。我真的建议你考虑通过你的数据库模型,并试图让你的约束进入数据库,而不是用Java解决它。 – sorencito
@JBNizet你是对的,这是一个_API_ _defect_,但实际上我们的服务方法更新现有的持久对象(通过获取持久对象ID作为输入参数) – mjafari