H2 SQL语法异常

10

我正在尝试导入H2的一个sql脚本。这个脚本由spring-batch提供,用于存储作业的元数据。当我在H2控制台中直接执行此脚本时,没有语法错误,但是当我在初始化阶段将相同的脚本引用到Hibernate/JPA中进行导入时,我收到了以下异常:

 org.hibernate.tool.hbm2ddl.ImportScriptException: Error during statement execution (file: 'org/springframework/batch/core/schema-h2.sql'): CREATE TABLE BATCH_JOB_INSTANCE  (
   ....    
    Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE TABLE BATCH_JOB_INSTANCE  ("; expected "identifier"; SQL statement:
CREATE TABLE BATCH_JOB_INSTANCE  ( [42001-171]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) ~[h2-1.3.171.jar:1.3.171]
    at org.h2.message.DbException.get(DbException.java:169) ~[h2-1.3.171.jar:1.3.171]
    at org.h2.message.DbException.getSyntaxError(DbException.java:194) ~[h2-1.3.171.jar:1.3.171]

以下是我尝试执行的脚本:https://code.google.com/p/joshlong-examples/source/browse/trunk/batch/src/main/resources/sql/schema-h2.sql?r=2

我正在使用hbm2ddl导入sql文件:

jpaProperties.setProperty("hibernate.connection.driver_class", "org.h2.Driver");
    jpaProperties.setProperty("hibernate.dialect", H2Dialect.class.getName());
    jpaProperties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
    jpaProperties.setProperty("hibernate.hbm2ddl.import_files",
        "org/springframework/batch/core/schema-drop-h2.sql,org/springframework/batch/core/schema-h2.sql");

你有什么想法可以解决这个问题吗?

2个回答

11

谢谢您的回答。当我直接在H2中执行脚本时,没有问题。但是当我使用hibernate导入文件时,出现了这个错误。 - Dimitri
1
这是一个Hibernate的“问题”。 - Ralph
它在您的编辑器中工作(但不与Hibernate一起工作),因为定界符在客户端而不是服务器中处理。因此,每个客户端可以以不同的方式处理它。 - Ralph

2

我终于找到了我的问题的答案。根据Ralph的回答,为了解决这个问题,在Hibernate中添加以下属性:

jpaProperties.setProperty("hibernate.hbm2ddl.import_files_sql_extractor", "org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor");

或者在XML中:

<property key="hibernate.hbm2ddl.import_files_sql_extractor" value="org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor" />

这个类MultipleLinesSqlCommandExtractor是接口ImportSqlCommandExtractor的一个实现。当使用Hibernate进行SchemaExport时,会调用该接口。默认实现是SingleLineSqlCommandExtractor,但出现了语法错误的未知原因。将单行提取器替换为多行提取器解决了这个问题。


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