【问题标题】:H2 SQL Grammar ExceptionH2 SQL 语法异常
【发布时间】:2013-07-29 08:44:42
【问题描述】:

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

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

【问题讨论】:

    标签: spring hibernate h2 spring-batch


    【解决方案1】:

    我终于找到了我的问题的答案。根据 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,并且由于未知原因返回语法错误。用多行提取器替换单行提取器解决了这个问题。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回答。当我直接在 H2 中执行脚本时,我没有问题。但是当我使用hibernate导入文件时,出现了这个错误。
      • 这是一个休眠“问题”。
      • 它适用于您的编辑器(但不适用于 Hibernate),因为分隔符是在客户端而不是在服务器中处理的。所以每个客户都可以用不同的方式处理它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2018-11-13
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多