gpt4 book ai didi

java - Spring 中的自定义 @Unique validator 抛出 Hibernate 断言失败

转载 作者:行者123 更新时间:2023-12-02 05:22:36 25 4
gpt4 key购买 nike

我制作了一个自定义的 @UniqueNombre validator 来检查数据库中是否已存在用户名,并且当它不重复并尝试保留数据时,它会抛出 Hibernate 异常:

ERROR org.hibernate.AssertionFailure - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in es.cesga.cloudpyme2.openinnovation.Usuario entry (don't flush the Session after an exception occurs)

validator 的代码是:

public class UniqueNombreValidator implements ConstraintValidator<UniqueNombre, String> {

@Override
public void initialize(UniqueNombre paramA) {
}

@Override
public boolean isValid(String nombre, ConstraintValidatorContext ctx) {
return (Usuario.countFindUsuariosByNombreEquals(nombre) == 0);
}

}

Controller :

@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Valid Usuario usuario, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) {
if (bindingResult.hasErrors()) {
populateEditForm(uiModel, usuario);
return "usuario/create";
}
uiModel.asMap().clear();
setUpUsuario(usuario, httpServletRequest);
usuario.persist();
return "redirect:/usuario/" + encodeUrlPathSegment(usuario.getIdUsuario().toString(), httpServletRequest);
}

如果不检查重复的用户名, Controller 就会像魅力一样工作。有什么想法吗?

更新:这是 validator 内部使用的方法:

public static Long Usuario.countFindUsuariosByNombreEquals(String nombre) {
if (nombre == null || nombre.length() == 0) throw new IllegalArgumentException("The nombre argument is required");
EntityManager em = Usuario.entityManager();
TypedQuery q = em.createQuery("SELECT COUNT(o) FROM Usuario AS o WHERE o.nombre = :nombre", Long.class);
q.setParameter("nombre", nombre);
return ((Long) q.getSingleResult());
}

最佳答案

如果没有完整的堆栈跟踪,我无法确定,但看起来您正在尝试使用 EntityManager交易之外。它在 Usuario 中被声明为静态。类,并通过静态方法调用。但是除非您在 Controller 中声明了一个事务(这并不常见),否则当您调用 em.createQuery(...) 时不会打开任何事务。 ,因此 Hibernate 会抛出异常。

由于您只执行只读操作,一个简单的解决方法是使用带有 OpenSessionInViewFilter在 View 模式中打开 session 。它允许(通常是只读的) session 在请求处理过程中始终处于可控制状态。

关于java - Spring 中的自定义 @Unique validator 抛出 Hibernate 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378820/

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