簡體   English   中英

為什么大多數hibernate應用程序都使用序列進行id生成?

[英]Why most hibernate applications are using sequence for id generation?

為什么大多數hibernate應用程序都使用序列進行id生成?

為什么不在@GeneratedValue注釋中使用默認的GenerationType = AUTO?

PS在我的職業生涯中,我看到每個人都是使用序列,但我不明白為什么他們更難以部署解決方案(在部署指令中始終有序列創建SQL命令)。

我看到幾個原因:

  1. 企業應用程序中使用最多的數據庫可能是Oracle,而Oracle沒有自動生成的ID,而是序列。
  2. 序列允許在插入新行之前使用ID,而不是在插入新行之后。 這更容易使用且更有效,因為您可以在事務結束時批量插入語句,但仍然在事務中間定義ID。
  3. 序列允許使用hilo算法(這是hibernate序列生成的默認算法),因此只對幾個插入進行一次DB調用,從而提高了性能。
  4. AUTO在數據庫之間變化,而序列始終使用相同的策略。

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

從第4章:對象關系映射,標識符生成部分。

[...]如果應用程序不關心提供程序使用哪種生成但希望生成,則可以指定AUTO策略。

但是,使用AUTO有一個問題。 提供者可以選擇自己的策略來存儲標識符,但它需要有某種持久性資源才能這樣做。 例如,如果它選擇基於表的策略,則需要創建一個表; 如果它選擇基於序列的策略,則需要創建序列。 提供程序不能始終依賴從服務器獲取的數據庫連接,以獲得在數據庫中創建表的權限。 這通常是特權操作,通常僅限於DBA。 需要某種創建階段或模式生成,以便在AUTO策略能夠運行之前創建資源。

AUTO模式實際上是開發或原型設計的一代策略。 在生成數據庫模式時,它可以很好地幫助您快速啟動和運行。 在任何其他情況下,最好使用后面章節中討論的其他一代策略[...]

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


選擇身份生成器有不同的考慮因素,最重要的是性能和可移植性,但也可能需要考慮群集和數據遷移。

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

您可以在我的博客上閱讀有關身份生成策略的相關詳細信息: 此處

的Eyal

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM