Oracle 如何在hibernate中处理/恢复DB完整性约束冲突异常?

Oracle 如何在hibernate中处理/恢复DB完整性约束冲突异常?,oracle,hibernate,jakarta-ee,constraints,Oracle,Hibernate,Jakarta Ee,Constraints,我正在开发一个使用JSF和hibernate作为其ORM的大型web应用程序。 我的hibernate会话很长(用户可以在屏幕上进行大量修改,只有在按下save按钮时,更改才会在DB上持续) 我最近遇到了一个用户修改回滚/取消的问题,并在寻找不同的解决方案和方法 我想从违反约束异常(“ORA-02292:完整性约束”)中恢复 考虑以下场景: 有一个带有记录“X”的表“X”和一个带有记录“Y”的表“Y”-其中“X”通过外键依赖于“Y”。 用户正在尝试删除记录“y”,尽管此步骤可能会违反完整性约束,

我正在开发一个使用JSF和hibernate作为其ORM的大型web应用程序。 我的hibernate会话很长(用户可以在屏幕上进行大量修改,只有在按下save按钮时,更改才会在DB上持续) 我最近遇到了一个用户修改回滚/取消的问题,并在寻找不同的解决方案和方法

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

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

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

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


更新:

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

因此,在我看来,我可以用三种不同的方法解决这个问题:
1. 在保存阶段验证所有修改—正如我所说的,这可能是一个性能问题,因为可能需要进行许多验证。
2.立即验证每个用户的修改-同样,这不是用户的首选选项,但在必要时也可以这样做。

3.在数据库级别找到一种处理此类场景(完整性约束…)的方法-如果有更多建议,我将不胜感激。

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

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

但是你说你不想要它

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

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

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


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

您可以将模型合并到新会话中。您尝试过吗?

“但不验证它们可能会导致不一致和错误的保存状态(如果您有难以/不可能在数据库中实现的验证约束)”,这是不准确的,因为在将其成功刷新到数据库的那一刻,这意味着状态是正确的(至少从数据完整性的角度来看),我想指出的是,在某些情况下,我们在验证涉及业务规则的内容。“除了外键、NOTNULL和其他一些约束,基于Java的验证更灵活、更强大。”我同意你的观点,但这个例子是一个简单的外键,据我所见,DB的一个强大功能是数据完整性,否则,如果我在验证代码中的所有内容,为什么我要定义NOTNULL和外键,我只能配置我的hibernate使用正确的关系,并且在D上不定义任何内容B级-我认为这种方法是错误的。”但你想让他们删除一些应该删除的内容