Spring Data REST是否支持JPA @Version?

时间:2013-09-13 07:26:24

标签: spring jpa spring-data-rest

我可以将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/

1 个答案:

答案 0 :(得分:3)

我会说不,这与使用Spring Data REST没什么关系。你已经提到你不能自己设置版本然后发生的事情是未定义的(我自己也有这种愉快的体验)。在发布普通表单数据并且不在会话中存储当前版本时,您基本上会遇到相同的问题(@SessionAttributes)。

我们最终做的是我们编写了一个hibernate拦截器(现在我猜是一个监听器),它进行检查(这样我们就可以实际设置版本字段)。这可以解决很多问题(但那是大约6年前),所以Hibernate可能已经改变了,现在可能采取不同的行动。