2012-04-03 3 views
0

최대 절전 모드를 사용하여 Java 클래스에서 Oracle 테이블로 매핑합니다. 내 기본 키 ID를 들면, 나는이 자주 예외를 다음 얻을,최대 절전 모드에서 oracle 자동 증가 트리거 사용

<generator class="increment"></generator> 

내 코드는 두 개의 시스템에서 실행해야하기 때문에 을 사용하고 있습니다 :

나 최대 절전 모드의 증가를 사용하고 있기 때문이다
java.util.concurrent.ExecutionException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 

Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184) 
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) 
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) 
at jobsrc.BasicDaoImpl.save(BasicDaoImpl.java:65) 

Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (DB.SYS_C0011343) violated 

at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343) 
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10700) 
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723) 
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
... 18 more 

, 그것은 메모리에있는 최신 숫자를 다시 시도합니다. 누구나 최대 절전 모드에서 oracle의 auto_increment를 어떻게 사용할 수 있습니까? 가 될 saveOrUpdate를 호출 할 때 내가 직접 데이터베이스에 트리거를 추가 할 수 있지만 충돌을 최대 절전 모드 :

org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update 
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184) 
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) 
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) 
at jobsrc.BasicDaoImpl.saveOrUpdate(BasicDaoImpl.java:37) 

Caused by: java.sql.BatchUpdateException: No more data to read from socket 
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343) 
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10700) 
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723) 
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
... 13 more 

가 대단히 !!!!!!!!! 감사

답변

1

Oracle에는 auto_increment 유형이 없습니다. 시퀀스 생성기는 그림과 같이 this section of the Hibernate reference manual에 설명 된대로 사용해야합니다.

+0

데이터베이스에서 트리거를 직접 사용하는 것이다. –

+0

AFAIK, 이제 Hibernate가 트리거에 의해 생성 된 값을 얻는 방법이있다. 닭고기와 계란의 문제입니다. 생성 된 키를 얻으려면 생성 된 키가 필요합니다. 시퀀스를 사용하십시오. –

+0

나는 순서를 시도, 값 점프 –

0

Hibernate는 실제로 트리거에 의해 생성 된 값을 읽을 수있다. 실제로 이것을 할 수있는 두 가지 방법이 있습니다 :

  1. org.hibernate.id.SequenceIdentityGenerator 생성자를 사용하십시오. 이것은 JDBC getGeneratedKeys 기능, 특히 반환 할 열의 이름을 지정할 수있는 양식에서 작동합니다. 이것은 데이터베이스간에 이식성이 매우 높습니다. 내 경험상 오라클 드라이버 버전에서도 이식성이 없다. (수년간 시도한 적은 없지만)
  2. org.hibernate.id.SelectGenerator 생성기를 사용한다. 이는 고유로 정의 된 등록 정보의 열을 사용하여 방금 삽입 한 행에서 식별자 열을 선택하여 작동합니다. (a) 고유 한 속성을 알려주기 위해 생성기를 구성하거나 (b) @ NaturalId/매핑을 사용하면 자동으로 사용됩니다.

그러나 "post insert"식별자 생성기 (IDENTITY 생성뿐만 아니라이 두 가지와 같은)는 응용 프로그램의 impl 세부 사항 측면에서 완전히 새로운 웜을 열 수 있습니다. 나는 "포스트 삽입 (post insert)"식별자 생성기를 사용하지 말 것을 강력히 권한다. 앞의 대답에서 논의 된 것처럼 시퀀스 생성기를 사용하는 것이 더 낫다.

관련 문제