【发布时间】:2017-10-02 10:05:31
【问题描述】:
有一个实体 Foo 带有一个 @Version 列。如果我想删除它,我希望 Spring Data JPA 和/或 Hibernate 检查 @Version 列的当前值是否与数据库中的值匹配。如果不是,则应拒绝删除。这对分离的实体按预期工作:
@Transactional
public void delete(Foo foo) {
fooRepository.delete(foo); // throws ObjectOptimisticLockingFailureException
}
但是,如果我首先从存储库中加载实体,然后使用不同版本在同一事务中将其删除,则无论@Version 列的值如何,删除都会通过:
@Transactional
public void delete(int fooId, long version) {
Foo foo = fooRepository.findOne(fooId);
foo.setVersion(version);
fooRepository.delete(foo); // passes regardless of value of version
}
当我查看 Hibernate 调试输出时,执行了版本比较 (delete from foo where id=? and version=?),但没有达到我期望的效果。
我错过了什么?
【问题讨论】:
标签: java hibernate jpa spring-data-jpa