2012-04-25 2 views
2

이것은 최대 절전 모드에 대한 두 번째 게시물입니다. 내가 최대 절전 모드를 사용하기 시작한 이래로 그것은 해결 된 문제보다 더 많은 문제를 안겨 주었다. 거의 평범한 JDBC를 사용해야하는 것처럼 느껴집니다. 어쨌든,Hibernate SequenceGenerator가 잘못된 nextval을 반환 함

여기 제가 전투를 시도하는 문제 중 하나입니다.

.hbm 파일의 내 시퀀스 생성기는 다음과 같습니다.

<id name="id" type="long" column="ID"> 
    <generator class="sequence"> 
     <param name="sequence">ADVENTURES_ID_SEQ</param> 
     <param name="allocationSize">1</param> 
     <param name="initialValue">17599</param> 
    </generator> 
</id> 

참고 : 초기 값은 LAST_NUMBER은 오라클 순서에 있기 때문입니다 17599.입니다 : 17,599

CREATED   25-APR-12 
LAST_DDL_TIME 25-APR-12 
SEQUENCE_OWNER ADVENTURE_ADMIN 
SEQUENCE_NAME ADVENTURES_ID_SEQ 
MIN_VALUE  1 
MAX_VALUE  9999999999999999999999999999 
INCREMENT_BY 1 
CYCLE_FLAG  N 
ORDER_FLAG  N 
CACHE_SIZE  20 
LAST_NUMBER  17599 

본인은 200로 생성 다음 시퀀스 (201)를 참조 코드를 실행하면 Hibernate Debug 문.

DEBUG SQL - select ADVENTURES_ID_SEQ.nextval from dual 
DEBUG SequenceGenerator - Sequence identifier generated: 201 

나는 nextval이 17600이어야한다고 예상했습니다. 오라클 시퀀스가 ​​전혀 사용되지 않는 것 같습니다.

구성에있어 문제점 및 해결 방법은 무엇입니까? 어떤 도움이라도 대단히 감사합니다.

감사

+0

같은 데이터베이스에서'select ADVENTURES_ID_SEQ.nextval from dual'을 실행하면 어떻게됩니까? – Firo

+0

정확한 값 17584, 17585, 17586 등을 제공합니다. DBA는 정보 테이블에이 경우 17599 인 잘못된 값을 표시 할 수 있다고 말했습니다. 이 잘못된 값은 정보를 계산하는 데 몇 가지 단축키를 사용하기 때문에 (Oracle) 지침으로 만 사용해야하기 때문입니다. – n00bc0der

답변

2

자동 응답 (해결 방법) : 난 아직도 문제를보고 있어요하지만 지금은 내가 해결 방법을 가지고있다. 그것이 나를 위해 일한 이래로 저는 그 질문을 완전한 것으로 선택합니다.

나는 오라클이 nextId 사용하여 트리거를 발생시키는 해요 :

create or replace 
TRIGGER ADVENTURE_ADMIN.ADVENTURES_ID_TRIG 
BEFORE INSERT ON ADVENTURE_ADMIN.ADVENTURES FOR EACH ROW 
WHEN (new.ID IS NULL) 
BEGIN 
    SELECT ADVENTURES_ID_SEQ.NEXTVAL INTO :new.ID FROM DUAL; 
END; 

그럼 내가시키는있어 최대 절전 모드가 오라클 트리거 ID를 생성 사용합니다. 이 작업에는 두 가지 방법이 있습니다.

첫 번째은 최대 절전 모드 select을 사용합니다. 이 접근 방식의 단점은 행을 페치하기위한 키로 최대 절전 모드에서 사용되는 고유 제한 조건이있는 테이블에 다른 열이 필요하다는 것입니다. 유일한 고유 키로 기본 키가있는 테이블을 가지고 있기 때문에 실제로 작동하지 않습니다.

두 번째은 Jean-Pol Landrain, Martin Zeltner가 만든 TriggerAssignedIdentityGenerator를 사용합니다. 출처는 here입니다. 이로 인해 나는 테이블에 대한 또 다른 고유 키를 찾는 문제를 해결할 수있었습니다. 다음

내가 그것을 사용하고 방법은 다음과 같습니다

<id name="id" type="long" column="ID"> 
    <generator class="org.hibernate.id.TriggerAssignedIdentityGenerator" /> 
</id> 

참고 사항 :이 문제를 사용하고 최대 절전 모드 버전. 나는 3.5.4를 사용하고있다. 최대 절전 모드 3.6은 나에게 효과가 없었습니다. JDBC와 오라클 드라이버 버전 또한 중요합니다. 소스 파일의. 서를 참조 할 수 있습니다.

+1

기쁜 내 ID 생성기가 도움이되었습니다! Hibernate 포럼에서이 생성기와 관련된 원래 게시물을 찾을 수 있습니다.지금은 꽤 오래되었지만, 많은 사람들의 공헌으로 인해 Hibernate 4에서도 계속 작동합니다. https://forum.hibernate.org/viewtopic.php?t=973262 – jplandrain

+0

@ n00bc0der 문제에 대한 이유를 찾았습니까? ? –

관련 문제