从“Apress - 从初学者到专业人士开始冬眠”p。 161,他们解释袋子收藏:
如果元素缺少正确的键,则会有性能 更新或删除操作时将显示的影响 对袋子的内容进行了处理。
正确的密钥是什么意思?
为什么在对包元素执行更新或删除操作时会对性能产生影响?
答案 0 :(得分:0)
它们表示基础db表上的主键。由于没有密钥,性能将受到影响,因此当密钥存在时,将需要表扫描与索引搜索
答案 1 :(得分:0)
假设你有一个Entity Parent,它有一个Children集合。如果不在列表中使用索引列,Hibernate将使用“Bag Semantics”来处理子集合。这意味着该集合是无序的,并且可以包含重复项。如果在删除子项时查看SQL日志,您将看到删除所有子项的删除语句。其次是#children - 1个插入,重新插入所有未删除的子项。为什么不只是一个删除语句?
请参阅此链接以获取完整说明(http://assarconsulting.blogspot.com/2009/08/why-hibernate-does-delete-all-then-re.html)。
显然,单个删除语句会更有效,对吧?在大多数情况下,我们实际上需要一个Set,因为我们的实体通常是唯一的。但是,很多开发人员仍然使用List(出于习惯)。默认情况下,对于没有索引列的列表,hibernate将使用Bag Semantics,性能更差。