gpt4 book ai didi

SELECT 查询的 Hibernate ConstraintViolationException

转载 作者:行者123 更新时间:2023-12-05 02:24:14 27 4
gpt4 key购买 nike

我有一个具有多字段唯一约束的持久类。但是定义的唯一约束对我来说还不够,因为在一个字段上,那些不相等但相似的值也是唯一的。

我实现了一个 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 个 persistObject(通过服务方法)。
  • 然后更新其中一个(通过服务方法)以便与另一个相似
  • 我希望抛出 DuplicatException

但实际上是一个 org.hibernate.exception。通过 checkUniqueConstraint 抛出 ConstraintViolationException!!

为什么?

最佳答案

问题一定在FlushMode。默认情况下,Hibernate 在执行查询之前刷新实体,请参阅 http://docs.jboss.org/hibernate/core/3.5/javadocs/org/hibernate/FlushMode.html#AUTO .

您必须已经部分初始化了新实体,将它们与 session 有界实体相关联,现在尝试执行查询。 Hibernate session 在查询之前执行刷新并因 ConstraintViolationException 而失败,这没关系。

解决方法:

  1. 在整个应用程序的 cfg 文件中将 FlushMode 更改为 COMMIT
  2. 通过 session.setFlushMode(FlushMode.COMMIT)
  3. 只修改一个 session
  4. 您可以通过调用 query.setFlushMode(FlushMode.COMMIT) 将更改的影响缩小到单个查询。

关于SELECT 查询的 Hibernate ConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14090386/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com