【问题标题】:Is bulk delete with named query a bad practice with JPA/HIBERNATE?使用命名查询进行批量删除是 JPA/HIBERNATE 的坏习惯吗?
【发布时间】:2021-09-24 12:27:51
【问题描述】:

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

例如这样:

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

如果是,为什么?

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

【问题讨论】:

  • 这是一个基于意见/主观的问题,所以我不太清楚您期望什么类型的答案 - 但您的查询无法正常工作。 COUNTRY 不能有人员引用,但仍被视为字符串 'BRAZIL'。

标签: hibernate jpa persistence eclipselink named-query


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-22
    • 2014-09-14
    • 1970-01-01
    • 2011-11-04
    • 2013-05-06
    • 1970-01-01
    • 2017-02-15
    • 2021-02-27
    • 2019-07-21
    相关资源
    最近更新 更多