2013-07-29 66 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,並且由於未知原因返回語法錯誤。用多線提取器替換單線提取器解決了問題。