【发布时间】:2015-09-02 01:37:50
【问题描述】:
我有一个使用 Spring Data JPA 的 Spring Boot 1.3.M1 Web 应用程序。对于乐观锁定,我正在执行以下操作:
- 注释实体中的版本列:
@Version private long version;。我通过查看数据库表确认该字段正在正确递增。 - 当用户请求编辑实体时,同时发送
version字段。 - 当用户编辑后按下提交时,接收
version字段作为隐藏字段或其他东西。 -
服务器端,获取实体的新副本,然后更新所需的字段以及
version字段。像这样:User user = userRepository.findOne(id); user.setName(updatedUser.getName()); user.setVersion(updatedUser.getVersion()); userRepository.save(user);
我希望这会在版本不匹配时引发异常。但事实并非如此。谷歌搜索,我发现一些帖子说我们无法设置附加实体的 @Vesion 属性,就像我在上面的第三条语句中所做的那样。
所以,我猜我必须手动检查版本不匹配并自己抛出异常。这是正确的方法,还是我遗漏了什么?
【问题讨论】:
-
Hibernate does 允许您手动修改 @version 字段(与 OpenJPA 不同)但这不符合 JPA 规范(请参阅第 11.1.54 节 @987654321 @) 。如果您直接绑定到实体,您的方法应该有效。您是否将 DTO 传递给您的服务并在此处填充实体?
-
是的,我上面代码中的 updatedUser 是 DTO。
标签: hibernate jpa spring-data-jpa