爲什麼大多數hibernate應用程序正在使用序列進行id生成?爲什麼大多數hibernate應用程序使用序列進行id生成?
爲什麼不在@GeneratedValue註釋中使用默認的GenerationType = AUTO?
P.S.在我的職業生涯中,我看到每個人都在使用序列,但我不明白他們爲何難以部署解決方案(在部署說明中總是有序列創建SQL命令)。
爲什麼大多數hibernate應用程序正在使用序列進行id生成?爲什麼大多數hibernate應用程序使用序列進行id生成?
爲什麼不在@GeneratedValue註釋中使用默認的GenerationType = AUTO?
P.S.在我的職業生涯中,我看到每個人都在使用序列,但我不明白他們爲何難以部署解決方案(在部署說明中總是有序列創建SQL命令)。
我看到幾個原因:
至少對於Oracle來說:一個原因是能夠跟蹤表中對象的數量(如果沒有對象從表中刪除,那麼特定於表格的序列是很好的)。使用GenerationType = AUTO時會使用全局序列號,當數據庫中有多個表時,會導致ID號中的空格。
有趣的觀察,我會檢查出 – IAdapter 2011-04-16 06:21:02
我使用GenerationType = AUTO,我注意到連續行之間的id的差距 – 2012-01-05 14:43:59
來自Mike Keith和Merrick Schincario的優秀書Pro JPA 2 Mastering Java Persistence API。
從第4章:對象關係映射,標識符生成一節。
[...]如果一個應用程序不關心什麼樣 一代所使用的 供應商,而是希望一代 發生,它可以指定 AUTO的戰略。
雖然有一個使用自動, 的漁獲。供應商可以選擇自己的策略來存儲標識符 ,但它需要持有某種類型的持久性資源才能這樣做。例如,如果它選擇一個基於表格的策略 ,則需要創建一個表格 ;如果選擇基於序列的策略 ,則需要 創建一個序列。提供者不能 總是依賴於它從服務器獲得的數據庫連接 到 有權限在 數據庫中創建表。這通常是 特權操作,通常是受限於DBA的 。將需要 作爲某種創建階段或 架構生成,以便在AUTO 策略能夠運行之前創建資源 。
AUTO模式實際上是一代 開發策略或 原型。當數據庫模式爲 被生成時,它可以很好地幫助您快速啓動並運行更多 。在任何其他情況 ,這將是更好地使用在後面的章節討論的其他代戰略 的 一個[...]
有可供選擇的身份產生不同的考慮,最重要的是性能和便攜性也是集羣和數據遷移可能是一個考慮因素。
實際上,在最新的Hibernate版本(如果不是全部),SEQUENCE策略實際上是一個基於序列的HiLo,而不是像人們假設的純序列。
可以讀取一個漂亮的細節就張貼在我的博客身份生成策略:here
的Eyal
什麼數據庫[S]你的目標? Auto對於MySQL用戶來說很常見,但對於Oracle或MS來說不是。不幸的是,所有的生成策略都有優點和缺點,這就是爲什麼它們有這麼多。 – 2011-04-15 14:36:59
@甲骨文。我認爲這背後肯定有一些原因。 – IAdapter 2011-04-16 06:17:37