在Hsqldb/H2的单元测试中遇到SequenceGenerator问题

3

我曾尝试使用Hsqldb和H2进行单元测试,但在序列生成器方面遇到了问题。字段声明如下。

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="keyword_seq")
@SequenceGenerator(name="keyword_seq",sequenceName="KEYWORD_ID_SEQ", allocationSize=1)
@Column(name="IM_KEYWORD_ID")
private Long keywordId;

当我尝试使用以下配置在Hsqldb中测试简单插入此表时,会出现错误。

<prop key="hibernate.connection.driver_class">org.hsqldb.jdbc.JDBCDriver</prop>
<prop key="hibernate.connection.url">jdbc:hsqldb:mem:testdb;sql.syntax_ora=true</prop>

抱歉,出现了错误:
   Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: KEYWORD_ID_SEQ.NEXTVAL
        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)

使用 H2:

<prop key="hibernate.connection.driver_class">org.h2.Driver</prop>
<prop key="hibernate.connection.url">jdbc:h2:~/test</prop>

错误信息为:

Hibernate: select KEYWORD_ID_SEQ.nextval from dual
3085 [main] WARN org.hibernate.util.JDBCExceptionReporter  - SQL Error: 42001, SQLState: 42001
3088 [main] ERROR org.hibernate.util.JDBCExceptionReporter  - Syntax error in SQL statement "SELECT KEYWORD_ID_SEQ.NEXTVAL FROM[*] DUAL "; expected "identifier"; SQL statement:

有任何想法,如何解决这个问题?


我所有的类都是基于注解的。 - RandomQuestion
1个回答

6
我认为方言设置错误了。你能检查一下你的Hibernate配置吗?

我正在使用以下代码:<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> - RandomQuestion
2
你需要将它更改为org.hibernate.dialect.HSQLDialect以适用于HSQL,将org.hibernate.dialect.H2Dialect更改为H2。正如你所注意到的,Hibernate会针对HSQL和H2数据库发出Oracle查询,因此会出现错误。 - gkamal
我已经切换到你提到的方言,但仍然出现错误。对于HSQLDB,错误是user lacks privilege or object not found: KEYWORD_ID_SEQ。对于H2,则是ERROR org.hibernate.util.JDBCExceptionReporter - Sequence "KEYWORD_ID_SEQ" not found; SQL statement:call next value for KEYWORD_ID_SEQ [90036-147]。我们需要在启动时自己创建一些序列吗? - RandomQuestion
1
是的,您需要使用 hibernate.hbm2ddl.auto 来创建 - 这样在启动期间就会创建数据库模式。 - gkamal
1
非常感谢gkamal,我正在使用注释类,所以我想hibernate.hbm2ddl.auto不是必需的。只需更改方言即可使其工作。之前可能有一些打字错误或者我当时感到有些困倦。 - RandomQuestion
很好,我认为你已经在使用hbm2ddl.auto了,没有它就不会工作。这不仅适用于hbm,对注释也是一样的。HSQL / H2是内存数据库,因此每次都需要动态设置模式。另外,请标记我的答案为正确答案。 - gkamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接