Oracle資料運用那種主鍵生成策略,至少5種
Hibernate是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程式使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成資料持久化的重任。
Assigned
Assigned方式由使用者生成主鍵值,並且要在save()之前指定否則會拋 Hibernate相關書籍
出異常 特點:主鍵的生成值完全由使用者決定,與底層資料庫無關。使用者需要維護主鍵值,在呼叫session.save()之前要指定主鍵值。
Hilo
Hilo使用高低位演算法生成主鍵,高低位演算法使用一個高位值和一個低位值,然後把演算法得到的兩個值拼接起來作為資料庫中的唯一主鍵。Hilo方式需要額外的資料庫表和欄位提供高位值來源。預設請況下使用的表是 hibernate_unique_key,預設欄位叫作next_hi。next_hi必須有一條記錄否則會出現錯誤。 特點:需要額外的資料庫表的支援,能保證同一個資料庫中主鍵的唯一性,但不能保證多個數據庫之間主鍵的唯一性。Hilo主鍵生成方式由Hibernate 維護,所以Hilo方式與底層資料庫無關,但不應該手動修改hi/lo演算法使用的表的值,否則會引起主鍵重複的異常。
Increment
Increment方式對主鍵值採取自動增長的方式生成新的主鍵值,但要求底層資料庫的支援Sequence。如Oracle,DB2等。需要在對映檔案xxx.hbm.xml中加入Increment標誌符的設定。 特點:由Hibernate本身維護,適用於所有的資料庫,不適合多程序併發更新資料庫,適合單一程序訪問資料庫。不能用於群集環境。
Identity
Identity當時根據底層資料庫,來支援自動增長,不同的資料庫用不同的主 Hibernate相關書籍
鍵增長方式。 特點:與底層資料庫有關,要求資料庫支援Identity,如MySQl中是auto_increment, SQL Server 中是Identity,支援的資料庫有MySql、SQL Server、DB2、Sybase和HypersonicSQL。 Identity無需Hibernate和使用者的干涉,使用較為方便,但不便於在不同的資料庫之間移植程式。
Sequence
Sequence需要底層資料庫支援Sequence方式,例如Oracle資料庫等 特點:需要底層資料庫的支援序列,支援序列的資料庫有DB2、PostgreSql、Oracle、SAPDb等在不同資料庫之間移植程式,特別從支援序列的資料庫移植到不支援序列的資料庫需要修改配置檔案
Native
Native主鍵生成方式會根據不同的底層資料庫自動選擇Identity、Sequence、Hilo主鍵生成方式 特點:根據不同的底層資料庫採用不同的主鍵生成方式。由於Hibernate會根據底層資料庫採用不同的對映方式,因此便於程式移植,專案中如果用到多個數據庫時,可以使用這種方式。
UUID
UUID使用128位UUID演算法生成主鍵,能夠保證網路環境下的主鍵唯一性,也就能夠保證在不同資料庫及不同伺服器下主鍵的唯一性。 特點;能夠保證資料庫中的主鍵唯一性,生成的主鍵佔用比較多的存貯空間
Foreign GUID
使用外部表的欄位作為主鍵。一般而言,利用uuid.hex方式生成主鍵將提供最好的效能和資料庫平臺適應性。
這10中生成OID識別符號的方法,increment比較常用,把識別符號生成的權力交給Hibernate處理.但是當同時多個Hibernate應用操作同一個資料庫,甚至同一張表的時候.就推薦使用identity 依賴底層資料庫實現,但是資料庫必須支援自動增長,當然針對不同的資料庫選擇不同的方法.如果你不能確定你使用的資料庫具體支援什麼的情況下.可以選擇用native 讓Hibernate來幫選擇identity,sequence,或hilo.
另外由於常用的資料庫,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主鍵生成機制(Auto-Increase 欄位或者Sequence)。我們可以在資料庫提供的主鍵生成機制上,採用generator-class=native的主鍵生成方式。
不過值得注意的是,一些資料庫提供的主鍵生成機制在效率上未必最佳,大量併發insert資料時可能會引起表之間的互鎖。資料庫提供的主鍵生成機制,往往是通過在一個內部表中儲存當前主鍵狀態(如對於自增型主鍵而言,此內部表中就維護著當前的最大值和遞增量),之後每次插入資料會讀取這個最大值,然後加上遞增量作為新記錄的主鍵,之後再把這個新的最大值更新回內部表中,這樣,一次Insert操作可能導致資料庫內部多次表讀寫操作,同時伴隨的還有資料的加鎖解鎖操作,這對效能產生了較大影響。因此,對於併發Insert要求較高的系統,推薦採用uuid.hex 作為主鍵生成機制