有一个实体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=?
)来完成的,但结果并不符合我的预期。我错过了什么?
DefaultDeleteEventListener.onDelete()
内部,可以看到在调用内部删除方法时它不会查看版本。 - Klaus GroenbaekonDelete
不会查看版本时,这是符合规范的,因为规范不要求delete
检查版本。我没有看到任何偏离规范的地方。 - manish