2013-07-29 11 views
9

Próbuję zaimportować skrypt sql dla H2. Ten skrypt jest dostarczany przez wiosenny wsad i służy do przechowywania metadanych zadań. Kiedy wykonać ten skrypt bezpośrednio w konsoli H2, nie mam żadnych błędów składniowych, ale odwołuje się ten sam scenariusz w Hibernate/JPA, który zostanie przywieziony w fazie inicjacji, mam ten wyjątek:Wyjątek gramatyki 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] 

Oto skrypt próbuję wykonać: https://code.google.com/p/joshlong-examples/source/browse/trunk/batch/src/main/resources/sql/schema-h2.sql?r=2

Używam hbm2ddl zaimportować plik 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"); 

Jakiś pomysł jak mogę rozwiązać ten problem?

Odpowiedz

10

Spróbuj napisać każdą ze swoich instrukcji tworzenia w jednym wierszu.

Ogranicznik instrukcji w import.sql jest znakiem nowej linii. Jeśli chcesz to zmienić, musisz użyć Hibernuj> 4.1. Nie można zaimplementować MultipleLinesSqlCommandExtractor i określić ją przez hibernate.hbm2ddl.import_files_sql_extractor

+0

Dzięki za odpowiedź. Kiedy wykonuję skrypty bezpośrednio w H2, nie mam problemu. Ale kiedy używam hibernacji do importowania plików, mam ten błąd. – Dimitri

+0

Jest to problem "Hibernuj". – Ralph

+0

Działa z edytorem (ale nie ze stanem hibernacji), ponieważ ogranicznik jest obsługiwany w kliencie, a nie na serwerze. Tak więc każdy klient może sobie z tym poradzić w inny sposób. – Ralph

2

końcu znalazłem odpowiedź na moje pytanie. Na podstawie odpowiedzi Ralph, aby rozwiązać ten problem, należy dodać następującą właściwość do hibernacji:

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

albo w formacie XML:

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

Ta klasa MultipleLinesSqlCommandExtractor jest implementacją interfejsu ImportSqlCommandExtractor. To jest interfejs wywoływany podczas wykonywania SchemaExport z Hibernate. Domyślna implementacja to SingleLineSqlCommandExtractor i z nieznanego powodu zwraca błąd składni. Zastąpienie ekstraktora jednoliniowego ekstraktorem wieloliniowym rozwiązało problem.