我们正在开发一个RESTful应用程序,数据层将由Hibernate处理,但我们不确定如何处理实体的更新。
我们计划执行以下操作:
1)客户端通过id请求实体
2)Hibernate加载实体,将请求的字段(始终包括版本号)复制到DTO中,然后将其转换为JSON并发送给客户端
3)客户端管理一些字段,并将带有版本号的实体发送回服务器。
4)服务器接收转换为DTO的JSON。
5)从Hibernate加载相应的实体,并将DTO的属性复制到实体中。
=> 即使客户端的版本号设置了,实体也会被覆盖。 这是否意味着我们总是需要自己检查客户端的版本号与已加载实例的版本号,而不是Hibernate自动完成此项任务?
在常规应用程序中使用会话时,分离的实例保存在HttpSession中。每当客户端更新实体时,实例都会从HttpSession中检索并更新某些属性。每当Hibernate提交更新时,如果版本号小于当前版本号,则会抛出ObjectStaleException。
问题在于,由于我们试图成为RESTful,因此没有任何Http会话可用。
有没有一种通用解决方案来处理RESTful应用程序中的乐观锁定,而不是自己检查版本号?
entityManager.save(myDto)
时,由于从客户端接收到的DTO中没有版本(因为@Version
更像是DAO关注的内容),所以我会遇到OptimisticLockException
异常。如果我执行Dto toBeSaved = objectMapper.map(queriedMatchingDaoUsingPrimaryKeyFromReceivedDto, Dto.class)
,那么我就有了版本,但我必须手动更新每个字段以根据接收到的DTO进行更新:这很繁琐,并且感觉可能会在长期内导致错误。 - payne