使用命名查询批量删除 JPA/HIBERNATE 是不好的做法吗?

问题描述

使用命名查询进行批量删除是一种不好的做法吗?

例如:

DELETE FROM PERSON 
WHERE ID IN ( 
    SELECT c.person.ID 
      FROM COUNTRY c 
     WHERE COUNTRY = 'BRAZIL'
);

如果是,为什么?

我知道命名查询不尊重需要手动解决的级联和其他 jpa 注释,但除此之外,这是一种不好的做法吗?有没有更喜欢的方式来做到这一点?

解决方法

这种类型的查询绕过 JPA 缓存机制,因此如果需要维护关系或与此实体相关,则您拥有自己的查询 - Country 可能仍然对任何缓存中已删除的 Person 有过时的引用。某些 JPA 提供程序 (EclipseLink) 默认具有 2 个级别的缓存,因此此类问题可能会持续很长时间 - 直到刷新国家/地区或重新启动应用程序。

但是每个工具都有它的位置。我在过去的项目中经常使用它来有效地删除较大的数据集,而不必将其提取到内存中,只需在其上调用 EntityManager.remove(entity)。我不建议过度使用或首先使用这种模式,但在需要时它确实是一个很好的工具。