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

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

现在,我注意到可以在此框架中使用@Version了。该版本是自己生成的还是您需要手动执行?

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

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

参考方案

自从我发布这个问题已经有一段时间了,但是我已经弄清楚了。我将解释自己的工作,以便对他人有所帮助。

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

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

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

如果您使用的是休眠模式,它将自动提取注释,并在您的表(以MySql为例)中创建一个“版本”行。每次更新记录时,休眠状态都会使计数器加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": "Stackoverflow",
    "street": "Plantaanstraat",
    "number": "2",
    "zipCode": "1234AS",
    "city": "Amsterdam"
 }

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

现在,如果该行未更新怎么办?这意味着在您请求信息后,在您快速洗手间时,其他人更新了该行。这意味着您的版本已过时!现在需要发生的事情实际上是特定于用例的,因此我将不赘述:)

希望有人可以使用此信息!

谢谢大家

在Spring Boot中如何在WebSSOProfileConsumerImpl中设置responseSkew属性值 - java

我正在尝试将SAML OKTA集成到春季启动应用程序中。我需要在Spring Boot中使用以下bean设置:谁能帮我在Spring Boot的webSSOprofileConsumer bean中设置responseSkew属性。我只需要上面在基于注解的Spring Boot注入中提到的xml配置的等效Spring注入技术。我已经通过链接了:http://…

在Spring Kafka中,我需要在应用程序中添加@EnableKafka批注吗? - java

我看到有人在他们的Spring Boot应用程序中添加@EnableKafka,我想知道为什么。我有一个工作的春季靴kafka生产者和使用者,并且没有使用@EnableKafka。那么,为什么人们需要显式添加它?谢谢。 java大神给出的解决方案 这是因为Spring Boot通过KafkaAutoConfiguration类(javadoc)为Kafka提…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Globbing模式以匹配目录和文件 - java

我正在使用递归函数遍历根目录下的文件。我只想提取*.txt文件,但不想排除目录。现在,我的代码如下所示:val stream = Files.newDirectoryStream(head, "*.txt") 但是这样做将不会匹配任何目录,并且返回的iterator()是False。我使用的是Mac,所以我不想包含的噪音文件是.DS_ST…

Java RegEx中的单词边界\ b - java

我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…