Jpa 删除之@Version注解的实体类无法删除的问题
最近在做数据归档,因为表里的数据太大了,然后就写了个批处理去跑。
结果发现,最新的数据都能从原表中删除,但是2年前的数据却无法删除,我是使用 jpa 中的 JpaRepository.deleteInBatch
进行删除的。
为什么2年前的数据无法删除呢,因为2年前我在表里加了乐观锁 revison 字段,对应实体类使用了 @Version reviosn
.
当时在表里新增这列的时候,没有使用默认值,所以老数据 revision 值都为 null , 所以使用上面的方法就无法删除。
通过查询得出,
在JPA中,如果一个实体类映射了一个数据库表,并且该表有一个版本字段,那么在执行删除操作时,JPA默认不会删除version为空的数据
。这是因为JPA认为,version为空的数据可能是历史数据,或者是在并发修改过程中被其他事务删除的数据。为了避免误删数据,JPA默认不删除version为空的数据。
所以,先更新数据,把 revision 为 null 更新为0,再去删除就正常了。