2013-07-29 64 views
9

我想为H2导入一个sql脚本。该脚本由spring-batch提供,用于存储作业元数据。当我直接在H2控制台执行这个脚本,我有没有语法错误,但我引用在休眠/ JPA相同的脚本在初始化阶段需要进口,我得到这个异常:H2 SQL语法异常

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"); 

任何想法如何,我可以解决这个问题?

回答

10

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

import.sql中的语句分隔符是一个换行符。如果你想改变它,那么你需要使用Hibernate> 4.1。在那里,你可以实现一个MultipleLinesSqlCommandExtractorhibernate.hbm2ddl.import_files_sql_extractor

+0

感谢您的回答。当我在H2中直接执行脚本时,我没有问题。但是,当我使用休眠导入文件时,我有这个错误。 – Dimitri

+0

这是一个休眠“问题”。 – Ralph

+0

它适用于您的编辑器(但不适用于Hibernate),因为分隔符是在不在服务器中的客户端中处理的。所以每个客户都可以用不同的方式处理它。 – Ralph

2

我终于找到了答案,我的问题指定。基于拉尔夫的答案,要解决此问题,添加以下属性为休眠:

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,并且由于未知原因返回语法错误。用多线提取器替换单线提取器解决了问题。