gpt4 book ai didi

java - 如何在 Spring MVC 中使用乐观锁

转载 作者:行者123 更新时间:2023-11-30 08:09:55 24 4
gpt4 key购买 nike

我一直在使用 Spring MVC + Spring Data JPA + Hibernate 开发博客应用程序。现在我对乐观锁定机制有疑问。我将在下面分享一段代码。 我已将 @Version 注释添加到实体。比我使用两个不同的浏览器同时更新同一条记录。每次我执行保存操作时,它都会增加 versioon +1 并更新数据。但是不会抛出任何异常如您所知,预期异常类似于 OptirmisticException。 我已经搜索过,但还没有关于它的信息。如果你能澄清我,我会很高兴。这是来自 Controller 的一段代码。谢谢大家。

@RequestMapping(value="/edit/{id}", method = RequestMethod.POST) 
public String postEdit(@PathVariable Long id , @ModelAttribute("category")Category formCategory){

try {
Category category = categoryService.findOneCategory(id);
if(category!=null) {
category.setCatName(formCategory.getCatName());
categoryService.save(category);
}
} catch (Exception e) {
LOGGER.debug("Error message : "+e);
}

return PAGE_DEFAULT;
}

最佳答案

在 Spring MVC 中应用乐观锁定是一个多步骤过程。

第 1 步:当显示表单供用户编辑时,存储要编辑的实体的版本号。这可以作为隐藏字段存储在表单中或 session 中(为了最小化 session 的大小,您可以只存储版本号而不是整个实体)。您还需要存储实体的主键。

第 2 步:保存实体时(您的 postEdit 步骤),您首先需要使用存储的主键从数据库中加载它。我认为最简单的方法是使用 @ModelAttribute 方法。

第 3 步:在您的 postEdit 方法中,获取存储的版本并将其与加载实体的版本进行比较。如果它们不同,则向用户报告错误。我更喜欢指示验证错误而不是抛出异常,因为它会带来更清晰的用户体验。

一些基于使用隐藏字段存储版本的代码示例:

@ModelAttribute("entity")
public Entity getEntity(@RequestParam(value="id", required=false) Long id) {
if (id == null) {
return new Entity();
} else {
Optional<Entity> entity = entityRepo.findById(id);
// TODO: Throw exception if not found (probably concurrently deleted).
return entity.orElse(null);
}
}

@RequestMapping(value="/entity/save", method=RequestMethod.POST)
public String postEdit(@Valid @ModelAttribute("entity") Entity entity, BindingResult bindingResult, @RequestParam(value = "version", required=false) Long version) {

if (entity.getVersion() != version) {
bindingResult.reject("concurrency", "The data was modified concurrently.");
}

if (bindingResult.hasErrors()) {
// TODO: Redisplay edit form
} else {
// TODO: Proceed with saving.
}
}

请注意,如果您使用名为“version”的隐藏字段并且您的实体的属性也被命名为“version”,那么您不应该在您的实体上使用 setVersion() 方法,否则 Spring 将自动填充(绑定(bind)) 基于隐藏字段的版本属性使您的支票无用。

关于java - 如何在 Spring MVC 中使用乐观锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32003925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com