我可以将JPA @Version
与Spring Data REST一起使用吗?
在Spring Data REST 1.1.0.M1中,我可以配置repo导出器来公开实体ID,它实际上也会公开@Version
- 带注释的字段。所以我想如果我尝试PUT
具有旧版本号的实体,我会得到OptimisticLockException
。但这不会发生。相反,PUT
成功(包括数据更新),除了版本号总是严格增加,而不是我设置的旧版本。
我读here我不应该自己设置版本号,因为行为未定义。那讲得通。但似乎这使得@Version
在我拥有的只是实体的JSON表示而不是对实体的引用的情况下无用:使用JSON表示我需要将版本号发送回服务,最终会调用setVersion()
,这反过来会导致未定义的行为。
我是否正确了解情况?我可以在Spring Data REST中使用@Version
吗?
更新:鉴于Marten的回应,我最终使用JPA事件来实现乐观锁定功能。我在这里写了这个方法:
http://springinpractice.com/2013/09/14/optimistic-locking-with-spring-data-rest/
答案 0 :(得分:3)
我会说不,这与使用Spring Data REST没什么关系。你已经提到你不能自己设置版本然后发生的事情是未定义的(我自己也有这种愉快的体验)。在发布普通表单数据并且不在会话中存储当前版本时,您基本上会遇到相同的问题(@SessionAttributes
)。
我们最终做的是我们编写了一个hibernate拦截器(现在我猜是一个监听器),它进行检查(这样我们就可以实际设置版本字段)。这可以解决很多问题(但那是大约6年前),所以Hibernate可能已经改变了,现在可能采取不同的行动。