1. 程式人生 > >面試題——Hibernate的主鍵生成策略

面試題——Hibernate的主鍵生成策略

4.2主鍵生成策略
            在<id>元素中通過 <generator class="生成策略"></generator>指定資料表主鍵生成策略  常用的生成策略有六種
        4.2.1    increment
                increment 識別符號生成器由 Hibernate 以遞增的方式為代理主鍵賦值
            原理: select max(id)  from customer  insert max(id)+1
            ***使用Increment建立表 沒有主鍵自增長 通過Hibernate在程式中內部完成自增長
            ***好處是可以跨平臺 缺點 高併發訪問 可以出現主鍵的衝突  模仿兩個執行緒同時併發
            適用範圍
                    由於 increment 生存識別符號機制不依賴於底層資料庫系統, 因此它適合所有的資料庫系統
                    適用於只有單個 Hibernate 應用程序訪問同一個資料庫的場合
                    OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常

        4.2.2  identity (Mysql)
                identity 識別符號生成器由底層資料庫來負責生成識別符號, 它要求底層資料庫把主鍵定義為自動增長欄位型別(加1帶走)
            原理:依賴資料庫內部增長  和Hibernate無關
            **建立表 not null auto_increment
            **優點無需程式處理 資料庫自己完成主鍵的增長 缺點mysql支援  oracle不支援
            ***沒有執行緒併發問題
            適用範圍:
            由於 identity 生成識別符號的機制依賴於底層資料庫系統, 因此, 要求底層資料庫系統必須支援自動增長欄位型別.
                支援自動增長欄位型別的資料庫包括: DB2, Mysql, MSSQLServer, Sybase 等
            OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常
        
        4.2.3  sequence----Oracle
                sequence  識別符號生成器利用底層資料庫提供的序列來生成識別符號
            原理:依賴資料庫序列的支援  和Hibernate無關
                oracle支援序列  mysql不支援序列
                序列的原理的:
                    create sequence customer_sq
                    insert into customer(id) values(customer_sq.nextval) 序列自動問
            適用範圍:
                適用範圍:
            由於 sequence 生成識別符號的機制依賴於底層資料庫系統的序列, 因此, 要求底層資料庫系統必須支援序列. 支援序列的資料庫包括: DB2 Oracle 等
            OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常

        
        4.2.4  native
            native 識別符號生成器依據底層資料庫對自動生成識別符號的支援能力, 來選擇使用 identity, sequence 或 hilo 識別符號生成器.
            適用範圍:
            由於 native 能根據底層資料庫系統的型別, 自動選擇合適的識別符號生成器, 因此很適合於跨資料庫平臺開發
            OID 必須為 long, int 或 short 型別, 如果把 OID 定義為 byte 型別, 在執行時會丟擲異常    
        
        4,2.5  uuid
            UUid的主鍵 採用String型別主鍵
                資料生成32位字串
                
        4.2.6  assigned
        前五種策略 都是代理主鍵的生成策略
        
            普通指定
                <id name="id" column="id">
                    <generator class="assigned"></generator>
                </id>
                適用物件時必須指定主鍵
            
            聯合主鍵
                主鍵並不是唯一 主鍵可以有兩個列組成 firestname +lastname
                Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: com.guigu.model.Person
                
            檢視建表語句  有聯合主鍵資訊