hibernate - RESTful 应用程序中的乐观锁定

标签 hibernate rest dto optimistic-locking

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

我们计划执行以下操作:

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

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

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

这里的问题是我们没有任何 Http session ,因为我们试图实现 RESTful。

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

最佳答案

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

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

关于hibernate - RESTful 应用程序中的乐观锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171298/

相关文章:

c# - 具有 O(1) 查找的数据传输对象

sql - 查询是否存在多个多对多关系

javascript - 哪个 HTTP 代码应该作为状态返回?

RESTful 子类型资源

rest - 使用 invoke-webrequest 将 crt 上传到 f5-ltm

用于返回值和返回值有效性的 Java 习惯用法或库?

c# - 这是对 DTO 的正确使用吗?

java - 无法初始化代理 - 无 session

java - 如何在 querydsl 中使用别名?

java - Web 服务和 JPA