2011-04-15 64 views
4

爲什麼大多數hibernate應用程序正在使用序列進行id生成?爲什麼大多數hibernate應用程序使用序列進行id生成?

爲什麼不在@GeneratedValue註釋中使用默認的GenerationType = AUTO?

P.S.在我的職業生涯中,我看到每個人都在使用序列,但我不明白他們爲何難以部署解決方案(在部署說明中總是有序列創建SQL命令)。

+0

什麼數據庫[S]你的目標? Auto對於MySQL用戶來說很常見,但對於Oracle或MS來說不是。不幸的是,所有的生成策略都有優點和缺點,這就是爲什麼它們有這麼多。 – 2011-04-15 14:36:59

+0

@甲骨文。我認爲這背後肯定有一些原因。 – IAdapter 2011-04-16 06:17:37

回答

3

我看到幾個原因:

  1. 最常用的企業應用程序中的數據庫可能是Oracle,Oracle不具有自動生成的ID,但是具有序列。
  2. 序列允許在插入新行之前擁有該ID,而不是在插入新行之後。這更容易使用,效率更高,因爲您可以在事務結束時批量插入語句,但在事務處理過程中仍然擁有定義的ID。
  3. 序列允許使用hilo算法(這是hibernate序列生成的缺省算法),因此只需對多個插入進行一次數據庫調用,從而提高性能。
  4. AUTO在數據庫之間有所不同,而序列總是使用相同的策略。
1

至少對於Oracle來說:一個原因是能夠跟蹤表中對象的數量(如果沒有對象從表中刪除,那麼特定於表格的序列是很好的)。使用GenerationType = AUTO時會使用全局序列號,當數據庫中有多個表時,會導致ID號中的空格。

+0

有趣的觀察,我會檢查出 – IAdapter 2011-04-16 06:21:02

+0

我使用GenerationType = AUTO,我注意到連續行之間的id的差距 – 2012-01-05 14:43:59

3

來自Mike Keith和Merrick Schincario的優秀書Pro JPA 2 Mastering Java Persistence API

從第4章:對象關係映射,標識符生成一節。

[...]如果一個應用程序不關心什麼樣 一代所使用的 供應商,而是希望一代 發生,它可以指定 AUTO的戰略。

雖然有一個使用自動, 的漁獲。供應商可以選擇自己的策略來存儲標識符 ,但它需要持有某種類型的持久性資源才能這樣做。例如,如果它選擇一個基於表格的策略 ,則需要創建一個表格 ;如果選擇基於序列的策略 ,則需要 創建一個序列。提供者不能 總是依賴於它從服務器獲得的數據庫連接 到 有權限在 數據庫中創建表。這通常是 特權操作,通常是受限於DBA的 。將需要 作爲某種創建階段或 架構生成,以便在AUTO 策略能夠運行之前創建資源 。

AUTO模式實際上是一代 開發策略或 原型。當數據庫模式爲 被生成時,它可以很好地幫助您快速啓動並運行更多 。在任何其他情況 ,這將是更好地使用在後面的章節討論的其他代戰略 的 一個[...]

1


有可供選擇的身份產生不同的考慮,最重要的是性能和便攜性也是集羣和數據遷移可能是一個考慮因素。

實際上,在最新的Hibernate版本(如果不是全部),SEQUENCE策略實際上是一個基於序列的HiLo,而不是像人們假設的純序列。

可以讀取一個漂亮的細節就張貼在我的博客身份生成策略:here

的Eyal

相關問題