在 spring-data 项目中使用 @Version

Posted

技术标签:

【中文标题】在 spring-data 项目中使用 @Version【英文标题】:Using @Version in spring-data project 【发布时间】:2012-05-25 18:50:34 【问题描述】:

我一直在使用 spring-data 开发 RESTful Web 服务。前几天特别的spring-data jpa REST frameworkwas released.

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

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

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

【问题讨论】:

【参考方案1】:

自从我发布这个问题以来已经有一段时间了,但我已经弄清楚了。我将解释我所做的事情,以便对其他人有所帮助。

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

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

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

如果您使用的是休眠,它会自动获取注释并在您的(在我的情况下为 mysql)表中创建一个“版本”列。每次更新记录时,hibernate 都会将计数器加 1。

现在为什么这是你想要的东西?那么您可能想要使用它的原因是因为它降低了您的客户与stale data 合作的机会。每当客户从您那里检索信息时,都会提供带有他请求的数据的版本。例如

                       <-- School entity -->
    "id": 1,
    "version": 0,                 
    "name": "De regenboog",
    "street": "Plantaanstraat",
    "number": "2",
    "zipCode": "1234AS",
    "city": "Amsterdam"

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

                        <-- School entity -->
    "id": 1,
    "version": 0,                 
    "name": "***",
    "street": "Plantaanstraat",
    "number": "2",
    "zipCode": "1234AS",
    "city": "Amsterdam"
 

Hibernate 会提供一个包含您的信息的查询,并添加一个额外的“where”子句来检查版本。 update .... where id = 1 and version = 0。现在,如果该行已更新,则意味着您提供了正确的版本,并且在您请求信息、更改信息并将其发回之间,没有其他人更改过该特定信息。不错吧?

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

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

【讨论】:

确实有道理。这对我很有帮助。谢谢 用@version注解的变量名可以有什么不同吗? @humbleCoder 是的!【参考方案2】:

确保导入 导入 javax.persistence.Version

不是春天的。

【讨论】:

我已经在我的回答中添加了这一点:“注释@Version 是一个 javax.persistence 接口,而不是我之前提到的 spring-data rest jpa 框架。” 重要的注释原因。 Spring @Version 注释适用于除 JPA 之外的所有内容。见***.com/a/31883006/328808。

以上是关于在 spring-data 项目中使用 @Version的主要内容,如果未能解决你的问题,请参考以下文章

通过 spring-data 迭代 MongoDB 中的大型集合

如何在 spring-data 中使用子图(使用休眠)?

使用 Eclipse Scala IDE 中的 spring-data 注入测试 playframework 2.4

如何在 Spring-data 中更改/定义 Mongodb 的默认数据库?

003-spring-data-elasticsearch 3.0.0.0使用-之spring-data简介,CrudRepository,PagingAndSortingRepository等(代码

Spring-Boot,无法使用spring-data JPA在MySql中保存unicode字符串