我正在使用弹簧数据存储库,我有一个问题,我无法找到答案.我的存储库查询是:
@Modifying @Query("UPDATE User u SET u.firstName = 'blabla' WHERE u.loginName = 'admin'") public int test();
该实体User
有一个带javax.persistence.Version
注释的字段:
@Version private Long version;
当我执行查询时,版本字段不会更新,但如果不是我执行的查询:
User user = this.userRepository.findUserById(1L); user.setFirstName("blabla"); this.userRepository.save(user);
版本字段已更新.为什么?
JPA 2.0规范的4.10节明确指出:
批量更新直接映射到数据库更新操作,绕过乐观锁定检查.如果需要,便携式应用程序必须手动更新版本列的值,和/或手动验证版本列的值.
一般而言,批量更新和删除几乎绕过了持久性提供程序应用的许多功能,您可能在简单地保存实体时使用这些功能.除了乐观锁定之外,还包括持久性提供程序管理的持久性操作级联.