1. 程式人生 > >hibernate利用mysql的自增長id屬性實現自增長id和手動賦值id並存

hibernate利用mysql的自增長id屬性實現自增長id和手動賦值id並存

  1、自動增長identity

適用於MySQL、DB2、MS SQL Server,採用資料庫生成的主鍵,用於為long、short、int型別生成唯一標識
使用SQL Server 和 MySQL 的自增欄位,這個方法不能放到 Oracle 中,Oracle 不支援自增欄位,要設定sequence(MySQL 和 SQL Server 中很常用)
資料庫中的語法如下:
MySQL:create table t_user(id int auto_increment primary key, name varchar(20));
SQL Server:create table t_user(id int identity(1,1) primary key, name varchar(20));

<id name="id" column="id" type="long">
<generator class="identity" />
</id>

2、sequence

DB2、Oracle均支援的序列,用於為long、short或int生成唯一標識
資料庫中的語法如下:
Oracle:create sequence seq_name increment by 1 start with 1;
需要主鍵值時可以呼叫seq_name.nextval或者seq_name.curval得到,資料庫會幫助我們維護這個sequence序列,保證每次取到的值唯一,如:
insert into tbl_name(id, name) values(seq_name.nextval, ‘Jimliu’);

<id name="id" column="id" type="long">
<generator class="sequence">
<param name="sequence">seq_name</param>
</generator>
</id>

如果我們沒有指定sequence引數,則Hibernate會訪問一個預設的sequence,是hibernate_sequence,我們也需要在資料庫中建立這個sequence
此外,sequence還可以有另外一個引數是paramters,可以檢視Hibernate的API瞭解它的用法,見org.hibernate.id.SequenceGenerator
呼叫資料庫的sequence來生成主鍵,要設定序列名,不然hibernate無法找到:
<param name="sequence">NAME_SEQ</param>(Oracle中很常用)

3、hilo

使用一個高/低位演算法生成的long、short或int型別的識別符號,給定一個表和欄位作為高位值的來源,預設的表是hibernate_unique_key,預設的欄位是next_hi。它將id的產生源分成兩部分,DB+記憶體,然後按照演算法結合在一起產生id值,可以在很少的連線次數內產生多條記錄,提高效率

MySQL:create table hi_value(next_hi integer not null);

insert into hi_value(next_hi) values(1);

<id name="id" column="id">
<generator class="hilo">
<param name="table">hi_value</param>
<param name="column">next_hi</param>
<param name="max_lo">100</param>
</generator>
</id>

在hibernate持久化的時候,由hibernate負責生成低位值。hilo識別符號生成器在生成識別符號時需要從hi_value表中取出next_hi的當前值,然後修改該值,這個操作是在單獨的事務中完成的。最大的低值在屬性max_lo中配置,但在Hibernate記憶體中生成的低位值超過此值時,就有需要到資料庫的hi_value表中再次讀取高位值了
使用hilo生成策略,要在資料庫中建立一張額外的表,預設表名為hibernate_unique_key,預設欄位為integer型別,名稱是next_hi(比較少用)
我們也可以自己設定自定義的表名和欄位名
<id name="id" type="integer">
<column name="id"/>
<generator class="hilo">
<param name="my_unique_key"/>
<param column="next_hi"/>
</generator>
</id>


4、native

會根據底層資料庫的能力,從identity、sequence、hilo中選擇一個,靈活性更強,但此時,如果選擇sequence或者hilo,則所有的表的主鍵都會從Hibernate預設的sequence或者hilo表中取。並且,有的資料庫對於預設情況主鍵生成測試的支援,效率並不是很高
對於 oracle 採用 Sequence 方式,對於MySQL 和 SQL Server 採用identity(自增主鍵生成機制),native就是將主鍵的生成工作交由資料庫完成,hibernate不管(很常用)

<id name="id" column="id">
<generator class="native" />
</id>

5、seqhilo

sequence和hilo的結合,hilo的高位由sequence產生,所以也需要底層資料庫的支援
通過hilo演算法實現,但是主鍵歷史儲存在Sequence中,適用於支援 Sequence 的資料庫,如 Oracle(比較少用)

<id name="id" column="id">
<generator class="seqhilo">
<param name="sequence">seq_name</param>
<param name="max_lo">100</param>
</generator>
</id>

6、increment

這個是由Hibernate在記憶體中生成主鍵,每次增量為1,不依賴於底層的資料庫,因此所有的資料庫都可以使用,但問題也隨之而來,由於是Hibernate生成的,所以只

能有一個Hibernate應用程序訪問資料庫,否則就會產生主鍵衝突,不能在叢集情況下使用
插入資料的時候hibernate會給主鍵新增一個自增的主鍵,但是一個hibernate例項就維護一個計數器,所以在多個例項執行的時候不能使用這個方法
<id name="id" column="id">
<generator class="increment" />
</id>

7、

uuid.hex

使用一個128-bit的UUID演算法生成字串型別的識別符號,UUID被編碼成一個32位16進位制數字的字串。UUID包含:IP地址、JVM啟動時間、系統時間(精確到1/4秒)和一個計數器值(JVM中唯一)
hibernate會算出一個128位的唯一值插入

<id name="id" column="id">
<generator class="uuid.hex" />
</id>


uuid.string
hibernate會算出一個16位的值插入


8、assigned

由應用程式負責生成主鍵識別符號,往往使用在資料庫中沒有代理主鍵,使用的主鍵與業務相關的情況,如:

<id name="id" column="id" type="string">
<generator class="assigned" />
</id>

這種主鍵的生成方式不建議使用,在資料庫表設計時就應該使用代理主鍵(surrogate key),不應使用自然主鍵(natural key具有業務含義),在沒有指定<generator>標籤時,預設就是assigned主鍵的生成方式
在插入資料的時候主鍵由使用者自己新增,hibernate也不管


9、foreign
使用外部表的欄位作為主鍵

10、select
使用觸發器生成主鍵(主要用於早期的資料庫主鍵生成機制,少用)

ps:

代理主鍵是指與業務無關且能唯一標識資料庫中記錄,一般是資料庫自動生成的,比如mysql可以使用auto_increment,Sql2000可以使用identity生成方式,oracle可以使用sequence生成方式 自然主鍵指業務相關,由使用者指定,且能唯一標識資料庫中的任意一條記錄



簡介版:

increment:代理主鍵,適合於所有資料庫,由hibernate維護主鍵自增,和底層資料庫無關,但是不適合於2個或以上hibernate程序。

identity:代理主鍵,適合於Mysql或ms sql server等支援自增的dbms,主鍵值不由hibernate維護。

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

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

hilo:代理主鍵,hibernate把特定表的欄位作為hign值,生成主鍵值

uuid.hex:代理主鍵,hibernate採用uuid 128位演算法生成基於字串的主鍵值

assign:適合於應用程式維護的自然主鍵。

相關推薦

hibernate利用mysql增長id屬性實現增長id手動id並存

  1、自動增長identity 適用於MySQL、DB2、MS SQL Server,採用資料庫生成的主鍵,用於為long、short、int型別生成唯一標識 使用SQL Server 和 MySQL 的自增欄位,這個方法不能放到 Oracle 中,Oracle 不支援自增欄位,要設定sequence(My

定義ObjectAnimator屬性實現

package com.loaderman.customviewdemo; import android.animation.ObjectAnimator; import android.graphics.Point; import android.os.Bundle; import and

Yaf定義autoload以實現Model文件Controller文件命名區分

處理 image func new rep down 眼睛 自定義 錯誤 先上圖: 由於Yaf作者在設計Yaf框架目錄時沒有直接區分開models文件和controllers文件,所以在IDE看著會很難受,眼睛離開了編輯器就不大好區分這兩個文件夾的文件。所以自己寫了一個

Android定義xml屬性定義(組合)控制元件

原文連結  本文是在“劍蕭舞蝶”的“Android中View自定義組合控制元件的基本編寫方法”的基礎上進行修正而來的。按照原作者的說發和程式碼來寫自定義控制元件,結果使用的時候出了不少問題。我之前對於這塊完全沒有去接觸,又看到有人說網上的例子都是大同小異,很多細節也沒有說清

Android 定義Adapter以實現定義填充ListView的Item

1>實體類---即ListView中各個Item中填充的內容 package com.demo.cxc.compoundview.com.demo.cxc.entity; import java.text.SimpleDateFormat; import java.

給EditCtrl新增定義選單並實現Copy,CutPaste功能

首先自定義一個類CEditCtrl,該類繼承與CEdit。在類中新增OnContextMenu(CWnd*, CPoint); void CEdit::OnContextMenu(CWnd*, CPoint) { CMenu Menu; Menu.Lo

C#中字段、屬性、只讀、構造函數、反射的相關

失敗 inter 註意 ring 空間 反射 存儲 進行 bind C#中字段、屬性和構造函數賦值的問題 提出問題 首先提出幾個問題: 1、如何實現自己的註入框架? 2、字段和自動屬性的區別是什麽? 3、字段和自動屬性聲明時的直接賦值和構造函數賦值有什麽區別?

python的類的屬性,可以不用宣告,在時直接生效

資料屬性相當於Smalltalk中的例項變數,和C++中的資料成員。資料屬性不需要宣告,像區域性變數一樣,當第一次給它分配值的時候,它就立即建立並存在了。 data attributes correspond to “instance variables” in Smalltalk, and t

使用linq機制 實現datatable連表查詢 結果到一個新的datatable

using System.Data;using System.Linq; //注意專案要引用System.Data.DataSetExtensions DataTable dtA = new DataTable(); dtA.Columns.Add("id", typeof(int)

mysql的資料型別int、bigint、smallint tinyint取範圍

目錄 int 註釋 使用整數資料的精確數字資料型別。 bigint         從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型資料(所有數字)。儲存大

JS+jQuery+Easyui實現動態新增控制元件及

背景:某天陽光明媚的午後,和小夥伴們完一個遊戲,在一個黑箱中放了紅橙黃綠青藍紫七種顏色的球,我讓幾名玩遊戲的小夥伴分別從黑箱裡抓球,並且統計他們都抓了哪種顏色的球。。最後的結果是,有抓的多,有抓的少,抓到的顏色也不一樣。 那麼問題來了!! 如果讓你做一個統計軟體怎麼記錄

使用AttachDetach來實現更新的時候避免逐一的麻煩

之前都是用擴充套件方法來copy屬性值,不過相容性不是很好。(關於這個擴充套件方法可以參照這個部落格),不過我們可以通過下方的程式碼來實現,由於是微軟提供的功能,所以不需要考慮相容性問題:public partial class WebForm2 : System.Web.

擴充套件jQuery easyui tabs元件,實現根據id(或者定義屬性)操作tab標籤

easyui是一個輕量級的後臺管理系統框架,各種元件均有,使用簡單方便,現在已經有免費版的License了。 但是它也有一些蛋疼的地方,比如tabs元件,該元件預設只能根據tab的title或者index進行相應的操作,有的時候這將令人非常的蛋疼,例如左側導航選單不同選單

解決Hibernate生成的表的代理主鍵(id)不是增長

如果你在Hibernate中建立ORM表對映時使用的是hbm.xml方式,那麼要注意了: 如果對id的描述中使用type=”Integer”的話,Hibernate生成的表結構中將不會是auto_increment。所以,要解決該問題只需要將type屬性

背景圖片利用backgrond-posintion屬性實現不同形式的分割

utf title borde images set absolut font 圖片 charset <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> &

利用ASP.netCore帶DI(DependencyInjection)實現批量依賴註入

time foreach tab develop sse 程序集 註入 mes collect ASP.net Core自帶DI(依賴註入),用法如下: services.AddScoped(typeof(IProductService), typeof(Produc

利用echarts highcharts 實現定義地圖 關系圖效果 側邊3D柱形圖餅圖散點圖

技術 ges 散點圖 chart blog 餅圖 git 分享 charts github 地址: https://https://github.com/Gengshaoxuan/medataMap github 地址: https://https://github.c

C#利用Windows帶gdi32.dll實現抓取屏幕功能實例

like lba work 函數 dll img 模板 seh release 本文實例講述了C#利用Windows自帶gdi32.dll實現抓取屏幕功能,是C#應用程序設計中一個非常實用的功能,現分享給大家供大家參考借鑒。 具體功能代碼如下:internal stati

2017年總結的前端文章——border屬性的多方位應用實現適應三角形

content ott 現在 修改 缺點 顏色 b- 固定 瀏覽器 border屬性是在實際的應用中使用頻率比較高的一個屬性,除了作為邊框使用,利用border屬性的一些特征以及表現方式,可以在實現一些比較常見的效果(如等高布局,上下固定內容滾動布局和繪制CSS圖標等),利

Mybatis+Mysql插入數據庫返回增主鍵id的三種方法

文章 param mysql int sta source nbsp 通用 映射 一、場景: 插入數據庫的值需要立即得到返回的主鍵id進行下一步程序操作 二、解決方法: 第一種:使用通用mapper的插入方法 Mapper.insertSelective(r