2011-04-26 17 views
13

I tienen el siguiente error usando H2 (v1.3.154) con el modo de Oracle:Cualquier idea en H2 (Oracle MODE) "Error de sintaxis: SELECCIONE NEXTVAL FROM [*] DUAL"?

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.h2.Driver" /> 
     <property name="url" value="jdbc:h2:mem:testdb;MODE=Oracle" /> 
     <property name="username" value="sa" /> 
     <property name="password" value="" /> 
</bean> 

y Oracle dialecto de hibernación v3.5.6:

hibernate.dialect=org.hibernate.dialect.Oracle10gDialect 

El error:

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT 
SQ_PERSON_ID.NEXTVAL FROM[*] DUAL "; expected "identifier"; SQL statement: 
select SQ_PERSON_ID.nextval from dual [42001-154] 
at org.h2.message.DbException.getJdbcSQLException(DbException.java:327) 
at org.h2.message.DbException.get(DbException.java:167) 
at org.h2.message.DbException.getSyntaxError(DbException.java:192) 
at org.h2.command.Parser.readColumnIdentifier(Parser.java:2752) 
at org.h2.command.Parser.readTermObjectDot(Parser.java:2311) 
at org.h2.command.Parser.readTerm(Parser.java:2428) 
at org.h2.command.Parser.readFactor(Parser.java:2025) 
at org.h2.command.Parser.readSum(Parser.java:2012) 
at org.h2.command.Parser.readConcat(Parser.java:1985) 
at org.h2.command.Parser.readCondition(Parser.java:1850) 
at org.h2.command.Parser.readAnd(Parser.java:1831) 
at org.h2.command.Parser.readExpression(Parser.java:1823) 
at org.h2.command.Parser.parseSelectSimpleSelectPart(Parser.java:1736) 
at org.h2.command.Parser.parseSelectSimple(Parser.java:1768) 
at org.h2.command.Parser.parseSelectSub(Parser.java:1663) 
at org.h2.command.Parser.parseSelectUnion(Parser.java:1508) 
at org.h2.command.Parser.parseSelect(Parser.java:1496) 
at org.h2.command.Parser.parsePrepared(Parser.java:401) 
at org.h2.command.Parser.parse(Parser.java:275) 
at org.h2.command.Parser.parse(Parser.java:247) 
at org.h2.command.Parser.prepare(Parser.java:201) 
at org.h2.command.Parser.prepareCommand(Parser.java:214) 
at org.h2.engine.Session.prepareLocal(Session.java:426) 
at org.h2.engine.Session.prepareCommand(Session.java:374) 
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1100) 
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71) 
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:243) 
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) 
at org.hibernate.jdbc.AbstractBatcher.prepareSelectStatement(AbstractBatcher.java:145) 
at org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:106) 
... 81 more 

¿Alguna idea de lo que sucede, una falla en mi configuración? Encontré this post y pruebo el parche, no resuelve el error. Gracias por tu ayuda !

+0

Definitivamente es la manera H2 de decir "La secuencia no existe". Tenía el mismo problema con este mensaje de error engañoso. – longliveenduro

Respuesta

0

Además de cualquier posible problema de Hibernate, ¿su usuario SA tiene permiso de selección en contra de la secuencia, que parece estar en un esquema diferente? (Ver example en la documentación).

+0

No lo creo, ya que es un error de sintaxis, no es un permiso denegado o no se encuentra la tabla ... –

+1

Mi lectura de la publicación a la que se ha vinculado es que H2 no reconoce el nombre de la secuencia y genera el mensaje identificador , no estás llegando a un error de Oracle. Pero no estoy familiarizado con esto, o cómo funciona bajo el capó. Suponiendo que el esquema al que pertenece la secuencia se incluye en su ruta de búsqueda de esquema, aún así verificaría que pueda verlo a través de SQL * Plus, etc. cuando esté conectado como 'SA'. (Como una suposición muy ingenua, quizás H2 está haciendo el equivalente de buscar en 'ALL_OBJECTS' o' ALL_SEQUENCES'). –

7

Asegúrese de que se crea la secuencia. Si se crea, entonces funciona para mí:

create sequence SQ_PERSON_ID; 
select SQ_PERSON_ID.nextval from dual; 

Si no se crea, a continuación, el mismo mensaje de error se lanza ya que conseguimos.

2

Compruebe si utiliza el mismo esquema en el que se crea la secuencia. De lo contrario, inserte un prefijo de esquema antes del nombre de la secuencia, como MYUSER.MY_SEQ.

Cuestiones relacionadas