我使用Hibernate删除用户活动实体,但收到以下错误:* 用户活动461发生错误。数据访问异常:不存在ID为461的类com.db.model.UserActivity实体!* 我从调度程序调用此异步方法。我知道如果deleteById不返回实体,则会抛出EmptyResultDataAccessException。但我不知道它为什么要尝试删除一个不存在的实体。请解释。
@Async
@Override
@Transactional
public void deleteUserActivities(@NonNull LocalDateTime createdBefore) {
for (Long uaId : userActivityRepository.findCreatedBefore(createdBefore)) {
try {
userActivityRepository.deleteById(uaId);
} catch (Exception e) {
log.error("Error for user activity {}", uaId, e);
}
}
}
2条答案
按热度按时间8yparm6h1#
当两个线程同时调用这个方法时,两个线程都可以得到相同的ID集,并且通过for循环,它们试图删除相同的实体,如果第一个线程先做,那么第二个线程失败。
如果调度程序在上一个调用结束之前调用此方法,则可能会发生这种情况
nqwrtyyt2#
但是我不知道为什么它要删除一个不存在的实体。请解释一下。
this 3.0.2之后的版本已经修复了这个问题。如果没有要删除的实体,现在不会抛出异常。