【发布时间】:2012-12-30 11:38:09
【问题描述】:
我有一个带有多字段唯一约束的持久类。但是定义的唯一约束对我来说是不够的,因为在其中一个字段不相等但相似的值也是唯一的。
我实现了一个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!!
为什么?
【问题讨论】:
-
向我们展示导致异常的代码,以及异常堆栈跟踪。你说你通过服务方法更新一个对象,但是服务方法添加一个新对象。
-
很难说问题出在哪里,但从我的角度来看,您正在尝试实现一些不希望的事情。我真的建议您仔细考虑您的数据库模型并尝试将您的约束放入数据库中,而不是用 Java 解决它。
-
@JBNizet 你是对的,这是一个 API defect 但实际上我们的服务方法更新了一个现有的持久对象(通过获取持久对象 id 为输入参数)
标签: hibernate hql unique-constraint transactional