在spring-data项目中使用@Version

48

我一直在使用Spring-Data开发RESTful Web服务。几天前,一个特殊的Spring-Data JPA REST框架发布了。

现在我注意到这个框架可以使用@Version。这个版本是自动生成的还是需要手动生成呢?

另外,我能否只使用@Version?(这样就不需要对我的现有存储库/域等进行任何更改)

最后,我需要进行额外的配置才能使用@Version吗?

2个回答

101

我发布这个问题已经有一段时间了,但我已经想出了解决方法。我将解释一下我的做法,希望对其他人有所帮助。

注释@Version是一个javax.persistence接口,而不是我之前提到的spring-data rest jpa框架。

如果你想使用@Version,你需要在你的领域对象中创建一个版本字段,如下所示:

@Version
@Column(name = "VERSION")
private long version;

如果您正在使用Hibernate,它会自动获取注释并在表中创建一个“version”列(在我的情况下是MySql)。每次记录更新时,Hibernate将计数器增加1。
那么为什么这是您想要的呢?您可能想要使用此功能的原因是因为它减少了客户端使用过时数据的机会。每当客户端从您那里检索信息时,都会提供与所请求的数据相关的版本。例如:
{                       <-- School entity -->
    "id": 1,
    "version": 0,                 
    "name": "De regenboog",
    "street": "Plantaanstraat",
    "number": "2",
    "zipCode": "1234AS",
    "city": "Amsterdam"
}

现在,如果客户端想要更改有关此特定记录的某些信息,它会将新信息与版本值一起发送。在这种情况下,让我们更改学校的名称。
 {                       <-- School entity -->
    "id": 1,
    "version": 0,                 
    "name": "Stackoverflow",
    "street": "Plantaanstraat",
    "number": "2",
    "zipCode": "1234AS",
    "city": "Amsterdam"
 }

Hibernate会使用你提供的信息生成一个查询,并添加一个额外的'where'子句来检查版本。update .... where id = 1 and version = 0。现在,如果该行被更新了,那么就意味着你提供了正确的版本,并且在你请求信息、更改信息并将其发送回来的时间内,没有其他人更改了这个特定的信息。很好吧?
现在,如果该行没有被更新呢?这意味着当你请求信息后去洗手间休息时,有其他人更新了该行。这意味着你的版本已经过时了!现在需要发生的事情确实是用例特定的,所以我不会详细介绍。
希望有人能利用这些信息!

那确实有道理。它肯定对我有帮助。谢谢。 - kalz
带有 @version 注释的变量名称可以是任何不同的吗? - humbleCoder
@humbleCoder 是的! - Byron Voorbach

11

请确保导入的是javax.persistence.Version而不是spring的版本。


我已经在我的回答中添加了这个内容:“注释@Version是一个javax.persistence接口,而不是我之前提到的spring-data rest jpa框架。” - Byron Voorbach
5
重要提示原因。Spring的@Version注释适用于除JPA之外的所有内容。请参阅https://dev59.com/NFwZ5IYBdhLWcg3wFMwR#31883006。 - Natan Cox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接