【发布时间】:2015-08-25 22:39:47
【问题描述】:
我正在开发一个使用 JSF 和 hibernate 作为其 ORM 的大型 Web 应用程序。 我的休眠会话很长(用户可以在屏幕上进行大量修改,并且当他按下保存按钮时,更改只会在 DB 上持续存在) 我最近正在努力解决用户修改的回滚/取消问题并寻找不同的解决方案和方法。
我想从违反约束异常(“ORA-02292:完整性约束”)中恢复。
考虑以下场景:
有一个带有记录“x”的表“X”和一个带有记录“y”的表“Y”——其中“x”通过外键取决于“y”。
用户正在尝试删除记录“y”,尽管此步骤将来可能会违反完整性约束,
我没有抛出任何异常,因为用户可以稍后修复它,并且只有当他不修复它并尝试保存屏幕时,数据库才会抛出异常,该异常将聚合到用户界面。
我找不到从这种违规行为中恢复过来的好方法。
在保存过程中,尝试删除记录'y'后,DB按预期启动“ORA-02292:完整性约束”异常。
我的问题是,如果发生这样的错误并且用户确实通过选择另一条记录而不是“y”来修复外键约束,休眠将无法识别它,因为 AFAIK 它仍然会首先尝试删除“y”(因为操作队列)并在执行将“y”替换为另一个实体的操作之前失败。
所以发生的事情是数据库在尝试保存更改时不断触发异常,并且我找不到在不刷新整个屏幕的情况下修复它的方法(这意味着新的休眠会话会丢失所有用户的新数据)。
似乎动作队列保存了删除动作,即使调用 Session “evict” 或 “clear” 方法也不会清除它。
我知道我可以在提交更改之前对其进行验证,并且它可能会起作用,但我对这种解决方案不感兴趣,因为: 1.验证大量可能的更改可能会导致性能问题,此外我相信oracle DB可以为我做得更好。 2. 我不想强制用户执行特定的操作顺序。
更新:
我觉得我应该对申请要求有所了解:
该应用程序的构建方式是,只能在保存阶段提交对 DB 的更改 - 这是用户需求,不幸的是,它不开放讨论,
其背后的想法是,用户希望在没有特定顺序的情况下进行更改,并在按下保存按钮之前随时修复错误的数据集。
由于此要求,验证也最好在保存阶段进行。
正如 Dragan Bozanovic 在下面指出的那样,我知道立即验证每个用户修改的可能性,但正如我所说,这不是用户的首选方式。
因此,在我看来,我可以通过三种不同的方式解决问题:
1.
在保存阶段验证所有修改 - 正如我所说,这可能是一个性能问题,因为可能需要进行许多验证。
2. 立即验证每个用户修改 - 这又不是用户的首选选项,但如果必须这样做。
3. 找到一种在数据库级别处理此类场景(完整性约束...)的方法 - 我将不胜感激对此方法的更多建议(如果有)。
【问题讨论】:
-
您考虑过DiSol 的建议吗?您可以将您的实体重新附加(合并)到一个新的会话吗?
标签: oracle hibernate jakarta-ee constraints