2013-07-29 9 views
9

Ich versuche, ein SQL-Skript für H2 zu importieren. Dieses Skript wird von Spring-Batch zur Verfügung gestellt und es wird verwendet, um die Metadaten des Jobs zu speichern. Als ich dieses Skript direkt in der H2-Konsole ausführen, habe ich keine Syntaxfehler, aber ich referenziert das gleiche Skript in Hibernate/JPA in der Initialisierungsphase importiert werden, habe ich diese Ausnahme:H2 SQL Grammar Ausnahme

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] 

Hier ist die Skript ich versuche auszuführen: https://code.google.com/p/joshlong-examples/source/browse/trunk/batch/src/main/resources/sql/schema-h2.sql?r=2

ich hbm2ddl bin mit der sQL-Datei zu importieren:

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

Jede Idee, wie ich dieses Problem lösen kann?

Antwort

10

Versuchen Sie, jede Ihrer create-Anweisungen in einer Zeile zu schreiben.

Das Anweisungstrennzeichen in import.sql ist ein Zeilenumbruch. Wenn Sie es ändern möchten, müssen Sie Hibernate> 4.1 verwenden. Dort können Sie eine MultipleLinesSqlCommandExtractor implementieren und geben es durch hibernate.hbm2ddl.import_files_sql_extractor

+0

Danke für Ihre Antwort. Wenn ich die Skripte direkt in H2 ausführe, habe ich kein Problem. Aber wenn ich Hibernate verwende, um die Dateien zu importieren, habe ich diesen Fehler. – Dimitri

+0

Es ist ein Hibernate "Problem". – Ralph

+0

Es funktioniert mit Ihrem Editor (aber nicht mit Hibernate), weil das Trennzeichen im Client nicht auf dem Server behandelt wird. So kann jeder Kunde anders damit umgehen. – Ralph

2

Schließlich fand ich die Antwort auf meine Frage. Basierend auf Ralphs Antwort, dieses Problem zu beheben, fügen Sie die folgende Eigenschaft für Hibernate:

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

Oder in XML:

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

Diese Klasse MultipleLinesSqlCommandExtractor ist eine Implementierung der Schnittstelle ImportSqlCommandExtractor. Diese Schnittstelle wird aufgerufen, wenn SchemaExport mit Hibernate ausgeführt wird. Die Standardimplementierung ist SingleLineSqlCommandExtractor und gibt aus unbekanntem Grund einen Syntaxfehler zurück. Durch das Ersetzen des Einzelleitungs-Extraktors durch den Mehrfachlinien-Extraktor wurde die Aufgabe gelöst.