在工作中,我们正在开发一个RESTful应用程序,其中的数据层将由Hibernate处理。但是我们不确定如何处理实体的更新。
我们计划执行以下操作:
1)客户端通过id请求一个实体 2)Hibernate加载该实体,将请求的字段(始终带有版本)复制到DTO,该DTO转换为JSON并发送给客户端 3)客户端管理一些字段并发送实体(版本号)返回到服务器。 4)服务器接收转换为DTO的JSON。 5)从Hibernate加载相应的实体,并将DTO的props复制到该实体。
=>即使设置了客户端的版本号,该实体也始终会被覆盖。这是否意味着我们总是必须自己检查客户端的版本号与加载实例的版本号,而不是Hibernate这样做?
在具有会话的常规应用程序中,分离的实例保存在HttpSession中。每当客户端更新实体时,都会从HttpSession中检索实例,并更新某些属性。每当Hibernate提交更新时,如果版本号小于当前版本号,则将引发ObjectStaleException。
这里的问题是我们没有Http会话,因为我们试图实现RESTful。
是否存在用于处理RESTful应用程序中的乐观锁定而不是自己检查版本号的通用解决方案?
你的策略很好。只需将来自客户端的版本号复制到加载的实体中(或使用merge(),将执行相同的操作),并且当Hibernate刷新实体时,如果版本号已增加,则将出现乐观锁异常。
merge()
您无需自己检查任何内容。Hibernate为您进行检查。