oracle - 如何在 hibernate 中处理/恢复数据库完整性约束违规异常?

标签 oracle hibernate jakarta-ee constraints

我正在开发一个大型 Web 应用程序,它使用 JSF 和 hibernate 作为其 ORM。 我的 hibernate session 很长(用户可以在屏幕上进行大量修改,并且当他按下保存按钮时,更改只会持久在数据库上) 我最近正在努力解决用户修改的回滚/取消问题,并寻找不同的解决方案和方法。

我想从违反约束异常(“ORA-02292:完整性约束”)中恢复。

考虑以下场景:
有一个包含记录“x”的表“X”和一个包含记录“y”的表“Y” - 其中“x”通过外键依赖于“y”。 用户正在尝试删除记录“y”,尽管此步骤将来可能会违反完整性约束, 我不会抛出任何异常,因为用户可以稍后修复它,并且只有当他不修复它并尝试保存屏幕时,数据库才会抛出一个异常,该异常将聚合到用户界面。

我找不到从这种违规行为中恢复的好方法。
在保存过程中,尝试删除记录“y”后,DB 如预期启动“ORA-02292:完整性约束”异常。
我的问题是,如果发生这样的错误,并且用户确实通过选择另一条记录而不是“y”来修复外键约束,则 hibernate 将无法识别它,因为据我所知,它仍然会首先尝试删除“y”(因为操作队列),并在执行将“y”替换为另一个实体的操作之前失败。
所以发生的事情是数据库在尝试保存更改时不断触发异常,并且我无法找到一种方法来修复它而不刷新整个屏幕(这意味着新的 hibernate session 会丢失所有用户新数据)。 操作队列似乎保存了删除操作,并且即使调用 session “evict”或“clear”方法也不会清除它。

我知道我可以在提交更改之前验证更改,并且它可能有效,但我对这种解决方案不感兴趣,因为: 1.验证大量可能的更改可能会导致性能问题,而且我相信oracle DB可以为我做得更好。 2. 我不想强制用户执行特定的操作顺序。


更新:

我觉得我应该阐明一些申请要求:
该应用程序的构建方式是,只能在保存阶段提交对数据库的更改 - 这是用户需求,不幸的是它不公开讨论
其背后的想法是,用户希望在没有特定顺序的情况下进行更改,并在按下保存按钮之前随时修复错误的数据集。
由于此要求,验证也优选在保存阶段进行。
我知道可以立即验证每一项用户修改,正如 Dragan Bozanovic 在下面指出的那样,但正如我所说,这不是用户的首选方式。

因此,据我所知,我可以通过三种不同的方式解决问题:
1. 在保存阶段验证所有修改 - 正如我所说,这可能是一个性能问题,因为可能需要进行许多验证。
2.立即验证每个用户修改 - 同样这不是用户的首选选项,但如果必须的话会这样做。
3.找到一种在数据库级别处理此类场景(完整性约束......)的方法 - 如果有的话,我会对此方法提出更多建议

最佳答案

不能,你的事务已经被标记为回滚,即使不重复删除也会失败。

解决方案是在数据库中执行数据/操作之前验证它们。

但你说过你不想要它。

“验证大量可能的更改可能会导致性能问题”但不验证它们可能会导致不一致和错误的保存状态(如果您的验证约束很难/不可能在数据库中实现) )。

“oracle DB 可以为我做得更好” 我不同意。除了外键、not null 和其他一些约束之外,基于 Java 的验证更加灵活和强大。

“我不想强制用户执行特定的操作顺序。”但您希望允许他们删除不应删除的内容,然后在 10 分钟后引发错误当他们尝试保存可能相互依赖的累积更改时(并假设删除会成功)。我确信用户在尝试执行删除后会很高兴看到错误,以免白白浪费 10 分钟时间。

我的观点和建议是,您应该在指示 Hibernate 删除实体之前进行验证。

关于oracle - 如何在 hibernate 中处理/恢复数据库完整性约束违规异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30760388/

相关文章:

oracle - 物化 View 日志的事务性能影响

java - JPA/hibernate : How to use INSERT JPQL?

oracle - 如何计算两列的行数?

oracle - 使用 FOR UPDATE SKIP LOCKED 打开 OUT SYS_REFCURSOR 时出错

java - 如何引用 Hibernate @ManyToOne 关联而不从数据库中加载它

java - Hibernate @NamedQuery 加入

java - 在基于 Struts 的 Web 应用程序中的 JSP 页面中使用 JSTL

java - 多个 GET 方法匹配 : select most specific

java - 在我的例子中,JSF 中选择哪种用户身份验证?

oracle - 在 Oracle 中,散列连接和排序合并连接有什么区别?