1. 程式人生 > >Hibernate主鍵生成策略總結

Hibernate主鍵生成策略總結

轉載自:http://blog.csdn.net/wanghuan203/article/details/7562395

Hibernate提供的主鍵生成策略,使我們可以在實體類的對映xml檔案中設定關鍵字來告訴hibernate我們要使用的主鍵生成方式,然後hibernate會根據設定完成資料庫的主鍵控制。

一、首先通過舉例子來了解實體對映檔案(*.hbm.xml)中對id生成策略配置格式

    使用者User的實體類User.java

  1. package com.bjpowernode.hibernate;  
  2. import java.util.Date;  
  3. publicclass User {  
  4.        private String id;          
  5.        private String name;   
  6.        public User(){}  
  7.        public String getId() {  
  8.            return id;  
  9.        }  
  10.        publicvoid setId(String id) {  
  11.            this.id = id;  
  12.        }  
  13.        public String getName() {  
  14.            return name;  
  15.        }  
  16.        publicvoid setName(String name) {  
  17.            this.name = name;  
  18.        }  
  19. }  

User.java對應的對映檔案User.hbm.xml

  1. <?xmlversion="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <
    hibernate-mapping>
  6.    <classname="com.bjpowernode.hibernate.User">
  7.             <idname="id">
  8.                      <generatorclass="uuid"/>
  9.             </id>
  10.             <propertyname="name"/>
  11.             <propertyname="password"/>
  12.    </class>
  13. </hibernate-mapping>

   其中

   <id name="id" column="表主鍵欄位名" type="java.lang.Integer">

        <generator class="設定主鍵生成策略型別"/>

   </id>

    二、Hibernate常用的主鍵生成策略的原理、特點、應用場合

    關於對映檔案的問題下次再介紹,這次主要總結hibernate常用主鍵生成策略。

   (1)increment

       a)對主鍵值採取自動順序增長的方式生成新的主鍵,值預設從1開始。

       b)原理:在當前應用例項中維持一個變數,以儲存當前最大值,之後每次需要生成主鍵值的時候將此值加1作為主鍵.不依賴於底層的資料庫,因此所有的資料庫都可以使用

       c)缺點:通過increment的生成主鍵的原理可推斷,此種主鍵生成策略不適用於叢集、同一時段大量使用者併發訪問的系統,既當大量使用者同一時間段同時進行插入操作的時候,可能存在取得相同的最大值然後再同時+1的情況,這個時候就會造成主鍵衝突。因此,如果同一資料庫有多個例項訪問,此方式必須避免使用。

   (2)UUID

       a)原理UUID使用128位UUID演算法生成主鍵,能夠保證網路環境下的主鍵唯一性,也就能夠保證在不同資料庫及不同伺服器下主鍵的唯一性。所以使用於所有資料庫。

       b)特點;能夠保證資料庫中的主鍵唯一性,但是在生成的主鍵佔用比較多的存貯空間 

   (3)Hilo

      a)原理:通過hi/lo 演算法(Hilo使用高低位演算法生成主鍵,高低位演算法使用一個高位值和一個低位值,然後把演算法得到的兩個值拼接起來)實現的主鍵生成機制,需要額外的資料庫表儲存主鍵生成歷史狀態。

       b)特點:需要額外的資料庫表和欄位提供高位值來源。預設情況下使用的表是   hibernate_unique_key,預設欄位叫作next_hi。next_hi必須有一條記錄否則會出現錯誤。需要額外的資料庫表的支援,能保證同一個資料庫中主鍵的唯一性,但不能保證多個數據庫之間主鍵的唯一性。Hilo主鍵生成方式由Hibernate 維護,所以Hilo方式與底層資料庫無關。

   (4)sequence

       a)sequence實際是就是一張單行單列的表。

       b)實現原理:呼叫資料庫中底層存在的sequence生成主鍵,需要底層資料庫的支援序列,因此他是依賴於資料庫的。

       c)支援sequence的資料庫有:Oracle 、DB2(Mysql/SQlServer不支援)、PostgreSql、SAPDb等

   (5)identity

       a)根據底層資料庫,來支援自動增長,不同的資料庫用不同的主鍵增長方式。

       b)特點: 與底層資料庫有關,要求資料庫支援Identity,如MySQl中是auto_increment, SQL Server 中是Identity。支援的資料庫有MySql、SQL Server、DB2、Sybase和HypersonicSQL。

       c)好處:在建表的時候指定了id為自動增長,實際開發中就不需要自己定義插入資料庫的主鍵值,系統會自動順序遞增一個值 。Identity無需Hibernate和使用者的干涉,使用較為方便,但由於依賴於資料庫,所以不便於在不同的資料庫之間移植程式。

   (6)native

       a)作用:根據資料庫的型別,自動在sequence 、identity和,hilo進行切換。

       b)實現自動切換的依據:根據Hibernate配置檔案中的方言來判斷是Oracle還是Mysql、SqlServer,然後針對資料庫的型別抉擇 sequence還是identity作為主鍵生成策略。

       c)用處:由於Hibernate會根據底層資料庫採用不同的對映方式,因此靈活性高,便於程式移植,專案中如果用到多個數據庫時,可以使用這種方式。

   (7)assigned

       a)作用:用於手工分配主鍵生成器,一旦指定為這個了,Hibernate就不在自動為程式做主鍵生成器了。沒有指定<generator>標籤時,預設就是assigned主鍵的生成方式

       b)使用方法:在程式中session.save();之前,由程式設計師自己指定主鍵值為多少。

         例如:user.setId(1);這就是在程式中程式設計師手動為使用者表指定主鍵值為1。

   (8)foreign

       只適用基於共享主鍵的一對一關聯對映的時候使用。即一個物件的主鍵是參照的另一張表的主鍵生成的。

   對資料庫的依賴性總結

    UUID,increment、Hilo、assigned:對資料庫無依賴

    identity:依賴Mysql或sql server,主鍵值不由hibernate維護

    sequence:適合於oracle等支援序列的dbms,主鍵值不由hibernate維護,由序列產生。

    native:根據底層資料庫的具體特性選擇適合的主鍵生成策略,如果是mysql或sqlserver,選擇identity,如果是oracle,選擇sequence。

   關於主鍵生成策略的選擇:

    一般來說推薦UUID,因為生成主鍵唯一,且對資料庫無依賴,可移植性強。

    由於常用的資料庫,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主鍵生成機制(Auto-Increase 欄位或者Sequence)。我們可以在資料庫提供的主鍵生成機制上,採用native,sequence或者identity的主鍵生成方式。

    不過值得注意的是,一些資料庫提供的主鍵生成機制在效率上未必最佳大量併發insert資料時可能會引起表之間的互鎖。

    因此,對於併發Insert要求較高的系統,推薦採用uuid作為主鍵生成機制。

    總之,hibernate主鍵生成器選擇,還要具體情況具體分析。一般而言,利用uuid方式生成主鍵將提供最好的效能和資料庫平臺適應性。

相關推薦

Hibernate生成策略總結

轉載自:http://blog.csdn.net/wanghuan203/article/details/7562395 Hibernate提供的主鍵生成策略,使我們可以在實體類的對映xml檔案中設定關鍵字來告訴hibernate我們要使用的主鍵生成方式,然後hibe

Hibernate 生成策略

關閉 min conn mine 數據 xml文件 ive orm 刪除 第一步:引入jar包 省略 第二部:創建實體類 package cn.hibernate.bean; public class Student { private Integer sId;

Hibernate生成策略

要求 mage src ble 配置 生成策略 padding pac 之前 Hibernate主鍵生成策略 1 hibernate要求實體類裏面有一個屬性作為唯一值,對應表主鍵,主鍵可以不同生成策略 2 hibernate主鍵生成策略有很多的值 3 在cl

Hibernate生成策略strategy = "increment"報錯違反唯一性約束

block 一個 blog tps 發現 rate 51cto image 主鍵 背景2018年7月份,系統爆出一條bug。就是支持Excel導入的功能,導入第二次同模板不同數據時,報錯,違反唯一性約束。就死活用不了了,重啟Tomcat才能恢復使用。但只能到一個文件 分析需

Hibernate(2)——IDEA+maven+hibernate生成策略

Maven版本hibernate程式 Pom.xml <dependencies>       <dependency>      

hibernate 生成策略

hibernate的主鍵生成器: generator元素:表示了一個主鍵生成器,它用來為持久化類例項生成唯一的標識 。 1.1 程式設計師自己控制:assigned 1.2 資料庫控制: identity(標識列/自動增長) sequence 1.3 hib

Hibernate--生成策略

原文地址:http://blog.csdn.net/kalision/article/details/9014023 Hibernate有很多值得學習的地方,這裡我們主要介紹Hibernate主鍵,包括介紹Assigned方式、Increment方式和Foreign GUID等方面。 Hibernate主

Hibernate生成策略解讀

Hibernate主鍵生成策略比較多,需要對這幾種策略有一定的瞭解才能更好的服務於你的專案,下面對幾種常見的Hibernate的主鍵生成策略進行解讀,一方面可以當做讀者的學習資料,另一方面可以為自己起

Hibernate 學習(三)Hibernate生成策略

生成主鍵的幾種形式 通過JPA的策略生成器來進行生成:JPA hibernate 其他的ORM框架照樣支援 GenerationType.TABLE,SEQUENCE Hiberante : foriegn uuid 自定義主鍵生成方式 TABLE快取

簡述Hibernate生成策略

HIbernate的主鍵型別有很多種,下面給大家介紹六種常見的主鍵型別 1.assigned:     assigned主鍵由外部程式生成,在save()之前必須指定一個。assigned主鍵型別與HIbernate和底層資料庫都無關,所以可以跨資料庫操作。assigne

Hibernate生成策略之Hilo

使用hilo生成策略,要在資料庫中建立一張額外的表,預設表名為hibernate_unique_key,預設欄位為integer型別,名稱是next_hi 我們也可以自己設定自定義的表名和欄位名 <id name="id" type="integer">   &l

Hibernate生成策略與save()方法是否發sql語句的研究

    public class SessionFlushTest extends TestCase {              /**     * 測試uuid主鍵生成策略     */       public void testSave1() {        

Hibernate生成策略總結

rem 時間值 多線程 class 判斷 acl 選擇 hiberna bsp 主鍵生成策略大致分兩種: 手工控制策略 自動生成策略【框架自動生成和數據庫自動生成】 手工控制策略: assigned:類型是任意的,需要在 save() 到數據庫前,編碼人員手工設置主鍵

(轉) Hibernate持久化類與生成策略

bject 規則 修飾符 cti arc arch 斷點 可能 策略 http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化類 什麽是持久化類呢?在Hibernate中持久化類的英

Hibernate框架的生成策略

如果 維護 自己 db2 取值 identity 返回 nat 數字   在Hibernate中,id元素的<generator>子元素用於生成持久化類的對象的唯一標識符,也就是主鍵。Hibernate框架中定義了許多主鍵生成策略類,也叫生成器類。所有的生成器類

Hibernate各種生成策略與配置詳解

文檔 最簡 重啟 如果 自定義 早期 出錯 lsp 當地時間 1、assigned 主鍵由外部程序負責生成,在 save() 之前必須指定一個。Hibernate不負責維護主鍵生成。與Hibernate和底層數據庫都無關,可以跨數據庫。在存儲對象前,必須要使用主鍵的sett

hibernate框架學習筆記4:生成策略、對象狀態

alt rri gen 線程安全 理論 微軟 unit conf lose 創建一個實體類: package domain; public class Customer { private Long cust_id; private Stri

Hibernate(二)】持久化類、生成策略和一級快取

1.2 持久化類的編寫規則 1.2.1 持久化類的概述 什麼是持久化類 持久化:將記憶體中的一個物件持久化到資料庫中過程。Hibernate框架就是用來進行持久化的框架。 持久化類:一個Java物件與資料庫的表建立了對映關係,那麼這個類在Hibernate中稱為是持久化類。

Hibernate工具類和生成策略

建立hibernate的好處 1.方便獲取session繪畫,用來操作資料庫 2.用來檢測所有的對映檔案配置是否準確 package com.two.util; import org.hibernate.Session; import org.hibernate.SessionFact

Hibernate自定義生成策略

在沒使用hibernate註解式之前,我們是需要建立hbm.xml的這樣一個用於對映的配置檔案,而我們的主鍵生成的方式則需要在這個xml的檔案內區定義。   黃色框框內就是我們主鍵生成的多種方式 1. <generator class="cok.zking