【发布时间】:2015-07-14 19:30:31
【问题描述】:
考虑以下使用 Jpa 进行持久化的场景。 学生可以通过 Web 表单关联到不同的课程。 所以这个表单显示了不同的实体(学生、课程)。
保存按钮按下,业务逻辑修改实体部分字段,db操作失败。
不幸的是,内存中的实体反映了业务逻辑所做的更改,这可能会产生一些不一致的问题。 有没有在类似情况下有用的模式?
我认为的可能解决方案以及我不喜欢它们的原因:
- 不想在数据库异常的情况下恢复对业务逻辑所做的所有更改,因为这是一个容易出错的工作。
- 不想在 db 异常之后重新加载实体,以确保它们与 db 对齐。事实上,这个操作也可能会失败。
否则我可以克隆实体,进行更改并在成功提交后将克隆与原始实体交换。
无论如何,遵循一个完善的模式,我会更舒服。
【问题讨论】:
-
公认的模式是重新加载实体。如果失败,则基本上意味着您的数据库或网络已关闭,或者应用程序存在错误,并且应用程序对此无能为力。
-
我对在回滚时重新加载实体的想法。这是一种有效的方法,因为大多数时候服务器没有额外的工作要做。实体恢复到一致状态,这很好。不幸的是,如果数据库出现临时故障,则重新加载也会失败,并且实体仍处于错误状态,如前所述。在这种情况下可以做什么?将实体设置为 null 可能会导致业务逻辑中出现其他异常,但让用户远离他正在填写的表单可能很有用!?
-
如果出现临时故障,您会向用户显示一条大红色消息,表示无法再访问数据库,并带有尝试刷新页面的链接。
标签: jpa design-patterns rollback