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