Posted on 2006-12-06 13:20
sxt 閱讀(809)
評論(0) 編輯 收藏
1. Assigned
???? 主鍵由應用邏輯產生,數據交由Hibernate保存時,主鍵值已經設置完畢,無需Hibernate干預。
2.? hilo
??? 通過hi/lo算法實現的主鍵生成機制,需要額外的數據庫表保存主鍵生成歷史狀態.
3.? seqhilo
??? 與hilo類似,通過hi/lo算法實現的主鍵生成機制,只是主鍵歷史狀態保存在Sequence中,適用于支持Sequence的數據庫,如Oracle。
4.? increment
??? 主鍵按數值順序遞增。此方式的實現機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:如果當前有多個實例訪問同一個數據庫,那么由于各個實例各自維護主鍵狀態,不同實例可能生成同樣的主鍵,從而造成主鍵重復異常。因此,如果同一數據庫有多個實例訪問,此方式必須避免使用。
5.? identity
??? 采用數據庫提供的主鍵生成機制,如SQL Server, MySQL中的自增主鍵生成機制。
6.? sequence
??? 采用數據庫提供的sequence機制生成主鍵.如Oralce Sequence.
7.? native
??? 由Hibernate根據數據庫適配器中的定義,自動采用identity, hilo, sequence的其中一種作為主鍵生成方式。
8.? uuid.hex
??? 由Hibernate基于,28位惟一值產生算法,根據當前設備IP,時間,JVM啟動時間,內部自增量等4個參數生成十六進制數值(編碼后以長度為32位的字符串表示)作為主鍵。這種算法在最大程度上保證了產生ID的惟一性,即使是在多實例并發運行的情況下。當然,重復的概率在理論上依然存在,只是實在過于渺茫(可能數萬年才出現一次)。一般而言,利用uuid.hex方式生成主鍵將提供最好的數據插入性能和數據庫平臺適應性。
9.? uuid.string·
??? 與uuid.hex類似,只是生成的主鍵未進行編碼(長度16位)。在某些數據庫中可能出現問題(如PostgreSQL )。
10. foreign
??? 使用外部表的字段作為主鍵,此類主鍵生成機制我們將在數據關聯部分結合實例進行講解。
11. select
??? Hibernate 3中新引入的主鍵獲取機制,主要針對遺留系統的改造工程。在一些早期系統中,主鍵可能依賴觸發器生成,即當數據庫發生insert操作時,通過觸發器捕獲這一操作,并為主鍵賦值。此時,我們就必須在插入數據之后,再次通過某一識別字段讀取己插入的數據,獲取其主鍵數據。
<轉自:深入淺出hibernate>