在Oracle模式下使用H2(v1.3.154)时出现以下错误:
<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>
和hibernate v3.5.6的Oracle方言:
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
错误:
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
知道发生了什么,我的配置错过了吗?我找到this post并尝试修补程序,它无法解决错误。谢谢你的帮助!
答案 0 :(得分:11)
请确保创建序列。如果它被创建,那么它适用于我:
create sequence SQ_PERSON_ID;
select SQ_PERSON_ID.nextval from dual;
如果未创建,则会抛出相同的错误消息。
答案 1 :(得分:2)
检查是否使用创建序列的相同模式。如果没有,请在序列名称前插入模式前缀,例如MYUSER.MY_SEQ。
答案 2 :(得分:2)
我当时正在使用Oracle模式进行h2,但是上述所有上述解决方案均不适用于我。 尽管经过一些研究,我发现此查询可以很好地获取序列中的下一个值。
select nextval('SchemaName', 'SequenceName')
;
答案 3 :(得分:0)
除了任何可能的Hibernate问题之外,您的SA
用户是否对该序列具有选择权限,该序列似乎位于不同的架构中? (参见文档中的example)。
答案 4 :(得分:0)
如@longliveenduro所述
这绝对是H2所说“序列不存在”的方式。
我遇到了完全相同的问题,发现该序列未在h2的内存数据库中创建。我通过添加以下内容解决了该问题:
CREATE SEQUENCE SQ_PERSON_ID
MINVALUE 1
MAXVALUE 9223372036854775807
START WITH 1
INCREMENT BY 1
CACHE 8
NOCYCLE;
在:test / resources / schema.sql
对我有用。
答案 5 :(得分:0)
再补充一点,与oracle不同,h2区分大小写。所以 DDL 和 java 代码至少应该对序列名称使用相同的大小写