1. 程式人生 > >Spring Data在Oracle中的自增ID隨機出現的問題解決

Spring Data在Oracle中的自增ID隨機出現的問題解決

1.  開發環境介紹

   Spring Data 1.6, JDK 1.6, Oracle 11g, Hibernate 4.3.5

2.    問題的提出

    在開發中,使用Annotation來配置Entity,即物件與Table的對映;程式碼示例如下:

@Entity(name = "PayOrderEntity")
@Table(name = "ES_OUTPAY_ORDER")
public class OrderEntity extends AuditableBaseEntity {

	@Id
	@Column
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "orderGenerator")
	@SequenceGenerator(name = "orderGenerator", sequenceName = "outpay_order_sequence")
	private long id;
        ......
}
   隨機的ID會被插入資料庫,ID為50, 150, 1050之類的遞增:

       

2.  問題分析

   資料庫本身經過分析,沒有問題,工作正常;資料庫表的建立語句也經過驗證沒有問題;最後經過分析,還是確定應該是程式碼的問題。原來的時候,使用Trigger來定義ID欄位的自增,現在改用Annotation中的SequenceGenerator, 新出現的問題。

   是否是generator定義本身的問題呢? 經過檢查和驗證,沒有問題。

   還是上網搜尋吧, 終於看到了一個未曾用過的欄位 allocationSize.

3.  問題的解決

      修正之後的程式碼如下:

@Entity(name = "PayOrderEntity")
@Table(name = "ES_OUTPAY_ORDER")
public class OrderEntity extends AuditableBaseEntity {

	@Id
	@Column
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "orderGenerator")
	@SequenceGenerator(name = "orderGenerator", sequenceName = "outpay_order_sequence", allocationSize=1)
	private long id;
        ........
}
4.  什麼是allocationSize?

   在原始碼的定義中,其預設值為50,故會出現50/51的ID。 在JPA中,其ID是通過allocationSize來設定其變化Size的。

參考資料:

1. http://stackoverflow.com/questions/12745751/hibernate-sequencegenerator-and-allocationsize

2. http://royontechnology.blogspot.hk/2010/04/note-on-allocationsize-parameter-of.html

相關推薦

Spring Data在OracleID隨機出現的問題解決

1.  開發環境介紹    Spring Data 1.6, JDK 1.6, Oracle 11g, Hibernate 4.3.5 2.    問題的提出     在開發中,使用Annotation來配置Entity,即物件與Table的對映;程式碼示例如下: @Ent

spring jpa 獲取id

1.為實體類的id註解 @GeneratedValue(strategy=GenerationType.IDENTITY) 指定id的生成策略 @Id @GeneratedValue(strategy = GenerationType.IDENTITY)

.NET 分散式Id元件(解決自動分配機器Id、時間回撥問題)

目錄 簡介 產生背景 使用方式 原始版 完美版 測試 結尾 簡介 IdHelper是一個.NET(支援.NET45+或.NET Standard2+)生成分散式趨勢自增Id元件,有兩個版本:原始版為基於雪花Id(不瞭解請自行百度)方案,需要手動管理設定WorkerId;完美版在原始版的基礎上使用Zoo

oracle實現id

acl pac primary 但是 數據庫 AR not select 簡單 在一些數據庫(例如mysql)中,實現自增id只要在建表的時候指定一下即可, 但是在oracle中要借助sequence來實現自增id, 要用上自增id,有幾種方式: 1.直接在inser

如何在mssql獲取最新ID的值

max 一次 執行 my sql server 數據庫 多條 的區別 mssq @@IDENTITY 返回最後一個插入 IDENTITY 的值,這些操作包括:INSERT, SELECT INTO,或者 bulk copy。如果在給沒有 IDENTITY 列的其他表插入記錄

mybatis 在oracle資料庫插入資料時獲取ID sequence序列

在oracle中sequence就是序號,每次取的時候它會自動增加。sequence與表沒有關係。 Create Sequence 首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE許可權。 建立語句如下: CREATE SEQUEN

oracle資料庫在mybatis框架獲取id

oracle資料庫獲取自增id的方法與mysql不一樣,後者通過設定useGeneratedKeys和keyProperty即可實現。 但是oralce資料庫自增是通過自定義的sequence佇列。所以方法上有所不同。 自增佇列: create or replace t

oracle如何建立表的ID(通過序列)

1、什麼是序列呢?     序列是一資料庫物件,利用它可生成唯一的整數。一般使用序列自動地生成主碼值。一個序列的值是由特別的Oracle程式自動生成,因而序列避免了在運用層實現序列而引起的效能瓶頸。 Oracle序列允許同時生成多個序列號,而每一個序列號是唯一的。 當一個

tp5 save()儲存後,獲取ID,獲取關聯表的某值

用過tp5的小夥伴們都知道用save方法新增資料返回的是寫入的記錄數。 但是專案中常常遇到在儲存成功資料後也要獲取這條資料的主鍵id,以方便存到其他表裡用作關聯需要,下面是程式碼示例: //向user表中儲存一條資料 $data = [ 'username'=>'ceshi',

spring Jdbctemplate返回插入記錄的Id

通常情況下我們在程式中往資料庫插入記錄,如果主鍵id是由資料庫負責生成,在插入成功之後都是返回主鍵id方便在插入其它資料時做主鍵關聯,spring Jdbctemplate對這個也是支援的,主要程式碼如下: public int insertTable(LabelForm

SSM配置Mybatis實現自動獲取插入資料的id至目標物件

Mybatis配置: <!-- 設定: 將插入資料的主鍵返回並新增到Contents物件中--> <insert id="insert" parameterType="com.c

淺談 SQL 的鎖(七)如何生成定義的 ID

在 SQL 表設計中,自增 ID 的使用很廣泛。因為有些資料的屬性並不具有唯一性,所以要給它加上一個生成的主鍵。生成主鍵最方便的方式,就是採用 SQL 產品提供的自增 ID 功能。可能自增 ID 的使用太過方便了,現在大有氾濫的趨勢,甚至有資深的工程師說:所有的表都應該有一個

mybatis 在oracle資料庫插入資料時獲取ID

就是建立一個SEQUENCE,通過它來獲取自增ID ① 在資料庫中操作: CREATE SEQUENCE CONFIG_KEYWORD_GATHER_SEQ;在XXXMapper.xml中程式碼:&l

mybatis 在oracle資料庫插入資料時獲取ID sequence序列

在oracle中sequence就是序號,每次取的時候它會自動增加。sequence與表沒有關係。 Create Sequence 首先要有CREATE SEQUENCE或者CREATE

Mysql獲取剛插入的id的三種方法

我們在寫資料庫程式的時候,經常會需要獲取某個表中的最大序號數, 一般情況下獲取剛插入的資料的id,使用select max(id) from table 是可以的。但在多執行緒情況下,就不行了。 下面介紹三種方法 (1) getGeneratedKeys()方法: 程式

mybatis逆向工程mapper配置檔案mysqlid 的配置

//在插入前id 自增 <selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE" >

mybatis generator MySQL ID出現重複問題MySQLIntegrityConstraintViolationException

PS:有時候不注意可能導致該問題,此處只做記錄,以供參考。 程式碼說明:資料庫是MySQL,用generator 生成的mapper.xml中的程式碼,自增ID,使用的是selectKey來獲取。 問題描述:insert的時候,新增的時候,第一條資料新增成功,接著新增第二條

往mysql插入 id不連續(曾經的坑)

merphix(CSDN UID:u014567183) 給博主提供了莫大的幫助 問題描述 事情是這樣的,博主用 Mybatis 往 mysql 做批量插入,結果發現特定的 SQL 語句導致 自增int型主鍵不連續,多方求證便有了這篇博文。 還原問題

ID算法snowflake(雪花)

ges gui python 訂單 解決 mage ans log pytho 在數據庫主鍵設計上,比較常見的方法是采用自增ID(1開始,每次加1)和生成GUID。生成GUID的方式雖然簡單,但是由於采用的是無意義的字符串,推測會在數據量增大時造成訪問過慢,在基礎互

MyBatis 批量插入獲取 id 問題解決

插入 lis foreach myba 如果 .cn bsp collect images 問題: 通過 MyBatis 進行批量插入時,如果我們想獲取插入對象所對應的主鍵 id,做法是直接在 <insert> 標簽中直接加入 useGeneratedKeys