在弹簧数据项目中使用@Version

我一直在研究一个带有弹簧数据的RESTful Web服务。几天前,一个特殊的spring-data jpa REST框架发布了

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

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

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


答案 1

自从我发布这个问题以来已经有一段时间了,但我已经想通了。我将解释我做了什么,以便可能对其他人有所帮助。

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

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

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

如果您使用的是休眠状态,它将自动拾取注释,并将在(在我的情况下为MySql)表中创建一个“版本”列。每次更新记录时,休眠将使计数器增加 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

现在,如果行未更新怎么办?这意味着在您请求信息后,其他人在您快速上厕所休息时更新了该行。这意味着您的版本已过时!现在需要发生的事情实际上是特定于用例的,因此我不会详细介绍

希望有人可以使用这条信息!


答案 2

确保导入导入 javax.persistence.Version

而不是春天的那个。


推荐