9

我正在尝试为 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");

知道如何解决这个问题吗?

4

2 回答 2

10

尝试将每个创建语句写在一行中。

import.sql 中的语句分隔符是换行符。如果要更改它,则需要使用 Hibernate > 4.1。在那里你可以实现 aMultipleLinesSqlCommandExtractor并指定它hibernate.hbm2ddl.import_files_sql_extractor

于 2013-07-29T14:24:56.717 回答
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并且由于未知原因返回语法错误。用多行提取器替换单行提取器解决了这个问题。

于 2013-07-29T15:11:01.747 回答