首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在spring-data项目中使用@Version

在spring-data项目中使用@Version
EN

Stack Overflow用户
提问于 2012-05-18 15:33:13
回答 2查看 31.6K关注 0票数 44

我一直在使用spring-data开发一个RESTful been服务。几天前,一个特殊的spring-data jpa REST框架was released

现在我注意到了在这个框架中使用@Version的能力。此版本是自动生成的,还是需要手动生成?

是否可以单独使用@Version?(这样我就不需要对现有的存储库/域等进行任何更改。)

我需要做一些额外的配置才能使用@Version吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-23 15:19:24

自从我发布这个问题已经有一段时间了,但我已经弄明白了。我会解释我做了什么,以便对其他人有所帮助。

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

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

代码语言:javascript
复制
@Version
@Column(name = "VERSION")
private long version;

如果你使用hibernate,它会自动获取注解,并在你的(我的例子是MySql)表中创建一个"version“列。每更新一条记录,hibernate就会将计数器加1。

为什么这是你想要的?你可能想要使用它的原因是因为它降低了你的客户使用stale data的机会。每当客户端从您那里检索信息时,都会为其提供一个版本,其中包含他所请求的数据。例如:

代码语言:javascript
复制
{                       <-- School entity -->
    "id": 1,
    "version": 0,                 
    "name": "De regenboog",
    "street": "Plantaanstraat",
    "number": "2",
    "zipCode": "1234AS",
    "city": "Amsterdam"
}

现在,如果客户端想要更改有关此特定记录的某些信息,它会将新信息与版本值一起发送。在这种情况下,让我们更改学校的名称。

代码语言:javascript
复制
 {                       <-- 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。现在,如果行被更新,这意味着您提供了正确的版本,并且在您请求信息、更改信息和发送回信息之间,没有其他人更改过该特定信息。很好,对吧?

现在,如果行没有被更新怎么办?这意味着在你请求信息后,其他人在你去洗手间的时候更新了那一行。这意味着你的版本已经过时了!现在需要做的事情实际上是特定于用例的,所以我不会详细介绍它

希望有人能用上这条信息!

票数 94
EN

Stack Overflow用户

发布于 2015-09-17 14:43:25

确保导入javax.persistence.Version

而不是春天的那个。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10648515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档