2014-03-25 96 views
0

獲取不當序列值,同時使用Hibernate插入記錄不正確的序列值,序列。爲什麼它正在發生獲取在Oracle 10g

CREATE TABLE "DOCTOR" 
    ( "DOCTOR_ID" NUMBER(10,0) NOT NULL ENABLE, 
    "DOCTOR_NAME" VARCHAR2(40), 
    "PLACE" VARCHAR2(40), 
    "PHONE_NUMBER" NUMBER(10,0), 
    CONSTRAINT "DOCTOR_PK" PRIMARY KEY ("DOCTOR_ID") ENABLE 
    ) 
/

CREATE OR REPLACE TRIGGER "BI_DOCTOR" 
    before insert on "DOCTOR"    
    for each row 
begin 
    select "DOCTOR_SEQ1".nextval into :NEW.DOCTOR_ID from dual; 
end; 

/
ALTER TRIGGER "BI_DOCTOR" ENABLE 

    DOCTOR_SEQ1: 
    Min Value 1 
    Max Value 999999999999999999999999999 
    Increment By 1 
    Cycle Flag N 
    Order Flag N 
    Cache Size 20 
    Last Number 261 

和配置爲休眠

hbm: 
     <id name="doctorId" type="long"> 
      <column name="DOCTOR_ID" precision="10" scale="0" /> 
      <generator class="sequence" > 
       <param name="sequence">DOCTOR_SEQ1</param> 
      </generator> 
     </id> 



    obtained values 
    245 ramesh knr 8080808080 
    243 chakri hyd 9090909090 
    247 rameshreddy knr 8080808080 

任何幫助遞增2值將不勝感激

+0

你可以發佈你獲得的序列值嗎? –

回答

0

從Oracle文檔,

* CACHE指定數據庫預分配和保留在內存中的序列數量,以便更快地訪問。此整數值可以有28個或更少的數字。此參數的最小值爲2.對於循環的序列,此值必須小於循環中的值數。您無法緩存比適合給定的序列號週期更多的值。如果發生系統故障/ ABS(增量)

-

(MINVALUE)CEIL(MAXVALUE):

因此,允許的高速緩存中的最大值必須小於由下式確定的值,那麼在提交的DML語句中未使用的所有緩存序列值都將丟失。潛在丟失值數等於CACHE參數的值。*

注意:如果您在Oracle Real Application Clusters環境中使用序列,Oracle建議使用CACHE設置來提高性能。

NOCACHE:指定NOCACHE以指示序列的值未預先分配。如果您省略了CACHE和NOCACHE,那麼數據庫默認會緩存20個序列號。

而且read this 所以用這個序列嘗試,

CREATE SEQUENCE doctor 
START WITH  1 
INCREMENT BY 1 
NOCACHE 
NOCYCLE; 

而且Order Flag需要爲Y爲了

希望這有助於生成序列!

+0

它仍然增加2只有 – techLearner

+1

工作正常後禁用TRIGGER「BI_DOCTOR」 – techLearner

0

序列每次遞增2的原因是有兩個系統都從序列中獲取值。

  1. Hibernate正在獲取序列值,例如, 1
  2. 休眠然後將該行插入表中
  3. 觸發器觸發,獲取新的序列值2,並覆蓋ID

無論是從使用序列休眠停止或刪除/禁用觸發器,或者如果你還需要其他非休眠系統觸發,如果需要修改它只能獲得一個ID :

CREATE OR REPLACE TRIGGER "BI_DOCTOR" 
    before insert on "DOCTOR"    
    for each row 
    when new.doctor_id is null 
begin 
    select "DOCTOR_SEQ1".nextval into :NEW.DOCTOR_ID from dual; 
end; 
/