目錄
- 1. 說明
- 2. 主鍵生成策略
- 3. hibernate_sequence表的創建
- 4. 如何避免自動創建hibernate_sequence表
1. 說明
- 1.JPA(Java Persistence API)在默認情況下,如果使用Hibernate作為持久化框架,并且沒有顯式指定主鍵生成策略,它可能會自動創建一個名為hibernate_sequence的序列表。
- 2.這個序列表用于生成唯一的主鍵值,特別是當使用@GeneratedValue注解且沒有指定strategy屬性時。
- 3.JPA規范支持多種主鍵生成策略,包括AUTO、IDENTITY、SEQUENCE和TABLE。這些策略決定了如何生成主鍵值。
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
2. 主鍵生成策略
- 1.AUTO:允許持久化提供者選擇生成策略。如果使用Hibernate,它通常會基于數據庫特定的Dialect選擇生成策略。對于大多數流行的關系數據庫,如MySQL,Hibernate會選擇SEQUENCE生成策略(如果數據庫支持序列),或者在某些情況下選擇TABLE或IDENTITY策略。
- 2.IDENTITY:使用數據庫的身份列(通常是自增列)來生成主鍵值。這是MySQL等數據庫常用的策略。
- 3.SEQUENCE:使用數據庫序列來生成唯一值。這通常用于支持序列的數據庫,如Oracle。
- 4.TABLE:使用一個單獨的數據庫表來生成主鍵值。這個表通常包含兩個列:一個用于存儲當前的最大主鍵值,另一個用于存儲生成主鍵值的增量。
3. hibernate_sequence表的創建
- 1.當JPA實體使用@GeneratedValue注解且沒有指定strategy屬性,并且Hibernate選擇SEQUENCE作為生成策略時(這取決于數據庫Dialect和配置),Hibernate會自動創建一個名為hibernate_sequence的序列表。
- 2.這個表只有一列(通常是next_val),用于存儲下一個主鍵值。
- 3.每次需要生成新主鍵時,Hibernate會向這個序列表中插入一行(或更新現有行),以獲取下一個主鍵值。
- 4.這個過程是自動的,通常不需要開發者干預。
4. 如何避免自動創建hibernate_sequence表
- 1.顯式指定主鍵生成策略:在@GeneratedValue注解中明確指定strategy屬性為IDENTITY,這樣Hibernate就會使用數據庫的身份列來生成主鍵值,而不會創建序列表。
- 2.使用自定義序列:如果你確實需要使用序列來生成主鍵值(例如,在Oracle數據庫中),你可以使用@SequenceGenerator注解來定義一個自定義的序列,并在@GeneratedValue注解中引用它。Hibernate就會使用你定義的序列而不是默認的hibernate_sequence。
- 3.配置Hibernate屬性:在某些情況下,你可以通過配置Hibernate的屬性來禁用序列表的自動創建。這通常不是推薦的做法,它可能依賴于特定的Hibernate版本和數據庫Dialect。