2013-07-29 29 views
9

Tôi đang cố nhập một tập lệnh sql cho H2. Kịch bản này được cung cấp bởi spring-batch và nó được sử dụng để lưu trữ siêu dữ liệu công việc. Khi tôi thực hiện kịch bản này trực tiếp trong H2 console, tôi không có lỗi cú pháp, nhưng tôi tham chiếu cùng một kịch bản trong Hibernate/JPA được nhập khẩu ở giai đoạn khởi, tôi đã ngoại lệ này:H2 SQL Grammar Exception

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] 

Đây là kịch bản tôi đang cố gắng để thực hiện: https://code.google.com/p/joshlong-examples/source/browse/trunk/batch/src/main/resources/sql/schema-h2.sql?r=2

tôi đang sử dụng hbm2ddl để import file 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"); 

Bất kỳ ý tưởng làm thế nào tôi có thể giải quyết vấn đề này?

Trả lời

10

Cố gắng viết từng câu lệnh tạo của bạn trong một dòng.

Dấu phân tách câu lệnh trong import.sql là một dòng mới. Nếu bạn muốn thay đổi nó, thì bạn cần sử dụng Hibernate> 4.1. Ở đó bạn có thể thực hiện một MultipleLinesSqlCommandExtractor và chỉ định nó bằng cách hibernate.hbm2ddl.import_files_sql_extractor

+0

Cảm ơn câu trả lời của bạn. Khi tôi thực thi các kịch bản trực tiếp trong H2, tôi không có vấn đề gì. Nhưng khi tôi đang sử dụng hibernate để nhập các tập tin, tôi có lỗi này. – Dimitri

+0

Đó là một "vấn đề" Hibernate. – Ralph

+0

Nó hoạt động với Trình chỉnh sửa của bạn (nhưng không phải với Hibernate) vì dấu phân tách được xử lý trong ứng dụng khách không có trong máy chủ. Vì vậy, mỗi khách hàng có thể xử lý nó theo một cách khác. – Ralph

2

cuối cùng tôi đã tìm thấy câu trả lời cho câu hỏi của tôi. Dựa trên câu trả lời của Ralph, để sửa chữa vấn đề này, thêm thuộc tính sau cho ngủ đông:

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

Hoặc trong XML:

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

này lớp MultipleLinesSqlCommandExtractor là một thực hiện các giao diện ImportSqlCommandExtractor. Đây là giao diện được gọi khi thực hiện SchemaExport với Hibernate. Việc triển khai mặc định là SingleLineSqlCommandExtractor và vì lý do không xác định sẽ trả về lỗi cú pháp. Thay thế bộ chiết dòng đơn với bộ giải mã nhiều dòng đã giải quyết vấn đề.