【问题标题】:Hibernate: Bag - performance impact in the case of update or delete operations?Hibernate:包 - 在更新或删除操作的情况下影响性能?
【发布时间】:2012-07-08 23:13:40
【问题描述】:

从“Apress - 从新手到专业人士开始休眠”p。 161,在那里他们解释了包包系列

如果元素缺少合适的键,就会有性能 更新或删除操作时会表现出来的影响 对包的内容进行。

  1. 正确的密钥是什么意思?

  2. 为什么对包元素执行更新或删除操作会影响性能?

【问题讨论】:

    标签: java hibernate collections bag


    【解决方案1】:

    它们表示基础数据库表上的主键。由于没有键,性能会受到影响,因此当键存在时需要表扫描而不是索引查找

    【讨论】:

    • 对于任何不包含键的表都是如此。为什么他们在讨论包包时会明确指出?
    【解决方案2】:

    假设你有一个父实体,它有一组子实体。在不使用列表中的索引列的情况下,Hibernate 将使用“Bag Semantics”来处理子项的集合。这意味着集合是无序的,并且可以包含重复项。如果您在删除孩子时查看 SQL 日志,您将看到一条删除语句删除所有孩子。后跟 # of children - 1 个插入,重新插入所有未删除的孩子。为什么不只是一个删除语句?

    有关完整说明,请参阅此链接 (http://assarconsulting.blogspot.com/2009/08/why-hibernate-does-delete-all-then-re.html)。

    显然,单个删除语句会更有效,对吧?在大多数情况下,我们实际上想要一个 Set,因为我们的实体通常是唯一的。但是,很多开发人员仍然使用 List(出于习惯)。默认情况下,对于没有索引列的列表,hibernate 将使用 Bag Semantics,性能较差。

    【讨论】:

    • :-) 你说显然发生了什么:由于删除所有孩子然后重新插入它们而导致性能不佳 - 但你没有说为什么要这样做。我也阅读了链接——这个人也告诉了发生了什么,但没有告诉为什么。他说:“我们之前问过,为什么不只发出一条删除语句。如果它停在这里,我们最终会得到(父母没有孩子)”。是的,但是为什么要首先删除所有孩子呢?删除equals java 集合中索引为 0 的子项的其中一个子项。另外,不像你,他说只有平等的孩子被删除,而不是所有的孩子(他的形象不同意)
    • 你不能使用 equals b/c 一个包可以包含重复项 - equals 可能导致多次删除 - 所以为了安全起见,休眠删除所有子项 - 然后重新插入仍然留在 Java 中的所有对象集合(在内存中)
    • 想想这个。一个包可以包含重复项,即与equals 比较时返回true 的元素。假设我的包中有重复项,我从 Java 包中取出一个。在提交时,我们可以简单地删除一个(不是全部)重复项,不管是哪一个——它们都与equals 相同。那有什么问题?此外,如果包中的元素是实体(即具有唯一的 id),您不必根据其完整的属性列表和对父级的 FK 删除元素,只需通过其 id 即可。另外,希望您在链接中看到他们谈论删除所有重复项,而不是所有子项 - 不那么痛苦
    • 来自您的原始帖子“如果元素缺少正确的键”.... 那么如何使用 SQL 仅删除一个?行数限制?它们是无序的,因此 SQL 不能保证删除哪条记录。至于删除所有重复项与删除所有子项 - 看看在休眠中使用 Bag Semantics 删除子项时会发生什么。如果您在此之后仍然好奇,我邀请您继续阅读您的书/进行研究。
    • 经过测试:所有子项都被删除(例如链接中的人很困惑)。 --- 我会通过“DELETE TOP 1 FROM .. WHERE ..”或方言等效项仅删除 1 个元素。因此,即使使用未索引的包,也可以使用 1 个 DELETE 删除 1 个孩子。我是说,如果我只从包中取出一个孩子,我可以避免删除全部重新插入。如我错了请纠正我。 --- 但我现在明白为什么休眠更具侵略性,它的 b/c 事情可能更复杂。例如,我可以更新或更新+删除。然后更改的java元素不再在db中,所以我无法通过sql找到它。所以我需要删除并重新创建数据库中的包。
    猜你喜欢
    • 2011-09-06
    • 2012-10-05
    • 1970-01-01
    • 2022-01-01
    • 2012-04-20
    • 2021-11-02
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多