Hibernate:Bag - 更新或删除操作时的性能影响?

时间:2012-07-08 23:13:40

标签: java hibernate collections bag

从“Apress - 从初学者到专业人士开始冬眠”p。 161,他们解释袋子收藏

  

如果元素缺少正确的键,则会有性能   更新或删除操作时将显示的影响   对袋子的内容进行了处理。

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

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

2 个答案:

答案 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,性能更差。