如何在MVC应用程序中使用@Version批注?

时间:2018-10-02 17:53:48

标签: java jpa version

我一直在研究防止两个用户认为他们同时成功修改了相同数据的方法。例如,如果两个用户加载了一个编辑页面,并且两个用户都在编辑页面上工作了几分钟,如果用户A提交了要保存的表单,然后用户B提交了表单,则用户B表单中的数据将获胜,因为它已更新在数据库中。这里的问题是,当用户A的工作现在丢失时,两个用户都认为他们的工作已保存,没有任何问题。

我希望可以使用JPA @Version批注。我可以通过在加载编辑页面时跟踪版本,并在提交表单时将版本发送到后端来做到这一点。来自前端的版本将放置在加载的实体的version字段中以进行更新,然后,如果该版本与db中的内容不匹配,我们将依靠JPA阻止保存。在上述情况下,用户A将获胜,而用户B将收到一条消息,指出他们的保存失败,因为数据已由另一个用户更新。

这里的问题是,由于不应该手动编辑与@Version批注关联的字段中设置的值,因此我已经在几个地方阅读过。问题是:这只是对正常使用的建议,但我的方法确实可行,还是更根本,还有其他一些不手动设置版本字段的原因?

我们的堆栈是Angular前端/ Spring + JPA(Hibernate)后端,因此请记住,从前端到后端的所有数据交换都是通过REST进行的,我们正在转换Java与JSON之间的对象。因此,我们典型的编辑/保存往返行程如下所示:

  1. 浏览器请求通过ID编辑实体
  2. 后端获取请求,使用JPA查找实体,将实体转换为JSON,作为响应发送到前端。
  3. 浏览器从响应中获取JSON,转换为对象,使用要编辑的对象中的数据绘制并预填充表单。
  4. 用户进行编辑并提交表单。浏览器使用表示已修改实体的JSON向后端发送新请求。
  5. 后端使用JPA查找实体,对其进行修改,然后使用JPA保存。

请注意,在第5步中,如果我们使用@Version批注并且未手动设置它,则该版本将不会更改,并且仍然存在一个问题,即提交表单的一个用户可能会覆盖另一个表单的用户变化。我建议前端跟踪版本号,通过编辑将其发送回后端,并在步骤5中让后端在检索到的对象上设置版本号。如果发生这种情况,将不会意外覆盖了先前用户的保存的保存失败了吗?

0 个答案:

没有答案