RESTful应用程序中的乐观锁定

use*_*927 6 rest hibernate dto optimistic-locking

在工作中,我们正在开发一个RESTful应用程序,其中数据层将由Hibernate处理.但我们不确定如何处理实体更新.

我们计划做以下事情:

1)客户端通过id请求实体
2)Hibernate加载实体,请求的字段(总是带有版本)被复制到转换为JSON并发送到客户端的DTO
3)客户端管理一些字段并发送实体(与版本号)回到服务器.
4)服务器接收转换为DTO的JSON.
5)从Hibernate加载相应的实体,并将DTO的道具复制到实体.

=>即使设置了客户端的版本号,也始终会覆盖实体.这是否意味着我们总是必须自己检查客户端的版本号与已加载实例的版本号,而不是Hibernate这样做?

在具有会话的常规应用程序中,分离的实例保存在HttpSession中.每当客户端更新实体时,都会从HttpSession中检索实例,并更新一些属性.每当Hibernate提交更新时,如果版本号是<当前版本号,则抛出ObjectStaleException.

这里的问题是我们没有任何Http会话,因为我们试图成为RESTful.

是否有一个通用的解决方案来处理RESTful应用程序中的乐观锁定,而不是自己检查版本号?

JB *_*zet 5

你的策略很好。只需将来自客户端的版本号复制到加载的实体中(或使用merge(),这将执行相同的操作),并且当 Hibernate 刷新实体时,如果版本号已增加,则会出现乐观锁异常。

你不需要自己检查任何东西。Hibernate 会为您进行检查。

  • 根据 Hibernate 规范,您不能更改已加载对象的版本号。所以我想我必须创建一个代表更改后的实体(具有旧版本号)的新实例,然后将其与加载的实体合并?但是在部分更新的情况下,合并会使某些字段无效......我仍然不确定如何处理这个问题。 (3认同)