2012-07-08 80 views
0

從「Apress - 從初級休眠到新手到專業」 161,在那裏他們解釋袋收集Hibernate:包 - 更新或刪除操作時的性能影響?

如果元素缺乏正確的密鑰,會有一個性能 影響時,包裝袋上的內容進行更新或刪除操作 將顯現出來。

  1. 他們是什麼意思通過適當的鑰匙嗎?

  2. 爲什麼在對行李元素執行更新或刪除操作時會有性能影響?

回答

0

它們表示底層數據庫表上的主鍵。由於沒有密鑰,因此性能將受損,因此需要進行表掃描,而索引在鑰匙存在時需要進行掃描。

+0

對於任何不包含密鑰的表,這都是真的。爲什麼他們會在討論包包時明確指定它? – rapt 2012-07-08 23:34:11

0

假設您有一個Entity Parent並且它有一個Children集合。如果不在列表中使用索引列,Hibernate將使用「Bag語義」來處理子集合。這意味着該集合是無序的,並且可以包含重複項。如果您在刪除孩子時觀看SQL日誌,則會看到刪除語句,刪除所有孩子。隨後是#個孩子 - 1個插入,重新插入所有未刪除的孩子。爲什麼不只是一個刪除語句?

查看此鏈接的完整說明(http://assarconsulting.blogspot.com/2009/08/why-hibernate-does-delete-all-then-re.html)。

顯然,對單個刪除語句來說效率更高,對嗎?在大多數情況下,我們實際上需要一個Set,因爲我們的實體通常是唯一的。但是,很多開發者仍然使用List(出於習慣)。默認情況下,對於沒有索引列的列表,hibernate將使用Bag語義,從而導致更糟的性能。

+0

:-)你說什麼顯然會發生:由於刪除所有的孩子,然後重新插入他們,表現不佳 - 但你沒有說爲什麼這樣做。我也讀過這個鏈接 - 這個人也告訴我會發生什麼,但不是爲什麼。他說:「我們早些時候問過,爲什麼不發出一條刪除聲明,如果它停在這裏,我們最終會得到(父母沒有孩子)」。是的,但爲什麼要刪除第一名的所有兒童?刪除java集合中索引爲0的子節點中的一個「equals」子節點。另外,與你不同,他說只有平等的孩子被刪除,並非所有的孩子(他的圖片不同意) – rapt 2012-07-09 02:03:07

+0

你不能使用等於B/CA袋可以包含重複 - 等於可能導致多個刪除 - 所以玩它安全休眠刪除所有兒童 - 然後重新插入仍然留在Java集合中的所有對象(在內存中) – jeff 2012-07-09 12:15:36

+0

想想這個。一個包可以包含重複項,也就是通過'equals'比較時返回'true'的元素。假設我的包中有重複項,並從Java包中刪除一個。在提交中,我們可以簡單地刪除一個(不是全部)重複項,不管它們是什麼 - 它們與equals相同。那有什麼問題?另外,如果包中的元素是實體(即具有唯一的ID),則不必根據其完整的屬性列表和FK將其刪除,只需通過其ID。另外,希望你在鏈接中看到刪除所有重複項,而不是所有的孩子 - 不那麼痛苦 – rapt 2012-07-09 13:45:52