我一直在使用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(&…