【问题标题】:Does Spring Data REST support JPA @Version?Spring Data REST 是否支持 JPA @Version?
【发布时间】:2013-09-17 19:19:35
【问题描述】:

我可以将 JPA @Version 与 Spring Data REST 一起使用吗?

在 Spring Data REST 1.1.0.M1 中,我可以配置 repo 导出器以公开实体 ID,碰巧这也会公开 @Version-annotated 字段。所以我想如果我尝试PUT 一个具有旧版本号的实体,我会得到OptimisticLockException。但这不会发生。相反,PUT 成功(包括数据更新),只是版本号始终严格递增,而不是我设置的任何旧版本。

我读到here 我不应该自己设置版本号,因为行为是未定义的。这就说得通了。但似乎这使得@Version 在我所拥有的只是实体的 JSON 表示而不是对实体的引用的情况下变得无用:使用 JSON 表示,我需要将版本号发送回服务,最终会调用setVersion(),这又会导致未定义的行为。

我是否正确理解了情况?我可以将 @Version 与 Spring Data REST 一起使用吗?

更新:鉴于 Marten 的响应,我最终使用 JPA 事件来实现乐观锁定功能。我在这里写了方法:

http://springinpractice.com/2013/09/14/optimistic-locking-with-spring-data-rest/

【问题讨论】:

  • 链接失效(

标签: spring jpa spring-data-rest


【解决方案1】:

我会说不,这与使用 Spring Data REST 没有太大关系。您已经提到您无法自己设置版本,因为随后发生的事情是未定义的(我自己也有过这种愉快的经历)。在发布普通表单数据而不将当前版本存储在会话中时,您基本上会遇到同样的问题 (@SessionAttributes)。

我们最终做的是我们编写了一个休眠拦截器(我猜现在应该是一个监听器)来进行检查(这样我们就可以实际设置版本字段)。这没有太多问题(但那是大约 6 年前的事了),所以 Hibernate 可能已经改变并且现在可能会有不同的行为。

【讨论】:

  • 谢谢马丁。我使用 SDR 事件机制做了类似的事情(基本上是在保存之前进行冲突检查),但我认为按照您建议的方式将它推回到更靠近数据库的位置会更好。
  • 我建议你在 springsource jira 上创建一个增强请求,也许他们可以添加一些开箱即用(或可配置)的东西。我可以看到这是一个常见的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2018-06-20
  • 1970-01-01
  • 2022-09-25
相关资源
最近更新 更多