Hibernate主鍵生成策略總結
轉載自:http://blog.csdn.net/wanghuan203/article/details/7562395
Hibernate提供的主鍵生成策略,使我們可以在實體類的對映xml檔案中設定關鍵字來告訴hibernate我們要使用的主鍵生成方式,然後hibernate會根據設定完成資料庫的主鍵控制。
一、首先通過舉例子來了解實體對映檔案(*.hbm.xml)中對id生成策略配置格式
使用者User的實體類User.java
- package com.bjpowernode.hibernate;
- import java.util.Date;
-
publicclass User {
- private String id;
- private String name;
- public User(){}
- public String getId() {
- return id;
- }
- publicvoid setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
-
}
- publicvoid setName(String name) {
- this.name = name;
- }
- }
User.java對應的對映檔案User.hbm.xml
- <?xmlversion="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
<
- <classname="com.bjpowernode.hibernate.User">
- <idname="id">
- <generatorclass="uuid"/>
- </id>
- <propertyname="name"/>
- <propertyname="password"/>
- </class>
- </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