在spring-data项目中使用@Version

时间:2012-05-18 07:33:13

标签: java hibernate spring-data spring-data-jpa spring-data-rest

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

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

是否可以自己使用@Version? (这样我就不必将任何内容更改为现有的存储库/域等。)

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

2 个答案:

答案 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

而不是春天。