我一直在使用带有spring-data的RESTful Web服务。几天前,一个特殊的spring-data jpa REST框架was released。
现在我注意到在这个框架中使用@Version的能力。此版本是由自己生成还是需要手动执行?
是否可以自己使用@Version? (这样我就不必将任何内容更改为现有的存储库/域等。)
我是否需要做一些额外的配置才能使用@Version?
答案 0 :(得分:59)
我发布这个问题已经有一段时间但是我已经弄明白了。我会解释我的所作所为,这对其他人可能有帮助。
注释@Version
是一个javax.persistence接口,而不是我前面提到的spring-data rest jpa框架。
如果您想使用@Version,您需要在域对象中创建一个版本字段,如下所示:
@Version
@Column(name = "VERSION")
private long version;
如果您正在使用hibernate,它将自动拾取注释,它将在您的(在我的案例中为MySql)表中创建一个“version”行。每次更新记录时,hibernate都会以1.增加计数器。
现在为什么这是你想要的?那么你可能想要使用它的原因是因为它减少了你的客户使用stale data的机会。每当客户端从您那里检索信息时,都会向其提供所请求数据的版本。 e.g。
{ <-- 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
。现在,如果行更新,则意味着您提供了正确的版本,并且在您请求信息,更改信息并将其发回之间,没有其他人更改过该特定信息。好吧?
现在该行未更新怎么办?这意味着在您请求信息后,当您在快速浴室休息时,其他人更新了该行。这意味着你的版本已经过时了!现在需要做的是特定用例,所以我不会详细介绍:)
希望有人可以使用这条信息!
全部谢谢
答案 1 :(得分:5)
确保导入 import javax.persistence.Version
而不是春天。