【发布时间】:2012-07-08 23:13:40
【问题描述】:
从“Apress - 从新手到专业人士开始休眠”p。 161,在那里他们解释了包包系列:
如果元素缺少合适的键,就会有性能 更新或删除操作时会表现出来的影响 对包的内容进行。
正确的密钥是什么意思?
为什么对包元素执行更新或删除操作会影响性能?
【问题讨论】:
标签: java hibernate collections bag
从“Apress - 从新手到专业人士开始休眠”p。 161,在那里他们解释了包包系列:
如果元素缺少合适的键,就会有性能 更新或删除操作时会表现出来的影响 对包的内容进行。
正确的密钥是什么意思?
为什么对包元素执行更新或删除操作会影响性能?
【问题讨论】:
标签: java hibernate collections bag
它们表示基础数据库表上的主键。由于没有键,性能会受到影响,因此当键存在时需要表扫描而不是索引查找
【讨论】:
假设你有一个父实体,它有一组子实体。在不使用列表中的索引列的情况下,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 比较时返回true 的元素。假设我的包中有重复项,我从 Java 包中取出一个。在提交时,我们可以简单地删除一个(不是全部)重复项,不管是哪一个——它们都与equals 相同。那有什么问题?此外,如果包中的元素是实体(即具有唯一的 id),您不必根据其完整的属性列表和对父级的 FK 删除元素,只需通过其 id 即可。另外,希望您在链接中看到他们谈论删除所有重复项,而不是所有子项 - 不那么痛苦