gpt4 book ai didi

java - 如何从 JPA 唯一约束违规中获取值?

转载 作者:行者123 更新时间:2023-11-29 05:27:24 25 4
gpt4 key购买 nike

我正在用 Primefaces 做一个 Web 项目,它从使用 JPA 的远程 EJB 发送和获取数据。在实体 Bean 中设置 unique=true 之后,我得到了这段代码来处理唯一值:

try{
emsave.persist(newItem);
} catch (PersistenceException pe){
System.out.println("dupe found");
}

然后我回滚事务。在 Eclipse 控制台中,我从 Jboss AS 获得了这些消息:

09:15:12,179 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8189-6) SQL Error: 1062, SQLState: 23000
09:15:12,179 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8189-6) Duplicate entry 'asdasd' for key 'username'

我必须将无法保存的对象发送回前端并将它们显示在表格中,或者以某种方式在表格中标记它们以便用户知道他必须更改什么。我有办法做到这一点,但我不知道如何标记哪个字段具有不良值(value)。是否有可能从此异常中错误地填充了“用户名”字段,或者应该使用其他方法?我正在寻找最优雅的解决方案。

最佳答案

首先,persist() 不是会抛出异常的东西。 persist() 仅通过将对象附加到持久性上下文来将其标记为持久性对象。实际插入将在刷新时发生。

其次,您似乎想循环执行此操作。所有运行时异常都是不可恢复的,并且会使上下文处于不可靠状态。一旦出现异常,就应该回滚当前事务,并且您不应该继续使用实体管理器。

最后,这两个事实和常见的良好做法引出了解决方案:您不应依赖异常来检测不正确的值。如果名称应该是唯一的,那么您应该发出查询以测试输入的名称是否已存在于表中,并且仅在验证所有内容后才插入。当然,您可能会在两个并发事务之间出现竞争条件,但这种情况不会经常发生,因此您可以使用通用的“Oops”错误消息来处理它(或者在确实需要时重试事务)。

关于java - 如何从 JPA 唯一约束违规中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22217858/

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