问题描述
例如:
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)。我不建议过度使用或首先使用这种模式,但在需要时它确实是一个很好的工具。