2012-02-07 8 views
9

H2 có phạm vi compatibility modes cho nhiều cơ sở dữ liệu khác như MS SQL Server, MySQL, Oracle, v.v. hỗ trợ các phương ngữ SQL khác nhau. Tuy nhiên, khi thiết lập embedded database vào mùa xuân, tôi không tìm thấy bất kỳ cài đặt tương ứng nào. Điều này có nghĩa là tôi phải sử dụng SQL "đơn giản" mà không có bất kỳ tính năng cụ thể nào của phương ngữ nếu tôi sử dụng Oracle trong sản xuất và H2 trong khi thử nghiệm? Tôi đã bỏ qua một cái gì đó?Cơ sở dữ liệu nhúng Spring có hỗ trợ các phương ngữ SQL khác nhau không?

Trả lời

9

Theo H2 doc, chế độ tương thích của Oracle khá hạn chế.

Ví dụ: bạn không thể sử dụng thủ tục PL/SQL.

Nếu bạn sử dụng EmbeddedDatabase của Spring, bạn không thể đặt chế độ tương thích; bạn phải thực hiện bạn sở hữu EmbeddedDatabaseConfigurer và chỉ định chế độ tương thích thông qua URL JDBC (xem bên dưới).

Nhưng cũng có thể, sử dụng chế độ tương thích với H2 và mùa xuân, bạn chỉ cần thiết lập các chế độ trong URL JDBC của bạn (vì vậy nó không phải là mùa xuân liên quan) một cách cổ điển, sử dụng một DataSource:

jdbc:h2:~/test;MODE=Oracle 

Và nếu bạn sử dụng Hibernate, bạn phải chỉ định phương ngữ của Oracle thay vì phương ngữ H2.

10

phiên bản cơ sở dữ liệu H2 nào? mỗi tài liệu, bạn có thể thiết lập chế độ tương thích bằng câu lệnh SQL (http://www.h2database.com/html/features.html#compatibility)

SET MODE PostgreSQL 

chỉ cần thêm tuyên bố này vào đầu tập tin sql script của bạn được nạp bởi Spring jdbc nhúng-cơ sở dữ liệu

0

Bạn có 2 lựa chọn:

  1. sử dụng mùa xuân để bắt đầu cơ sở dữ liệu H2 như sau (đánh dấu setName() để xem làm thế nào để vượt qua các thông số URL cụ thể H2 để mùa xuân xây dựng):

đang mùa xuân sẽ tạo URL như sau:

String.format ("jdbc: h2: mem:% s; DB_CLOSE_DELAY = -1", databasename)

Vì vậy, trong setName(), bạn đều có thể bất kỳ Tham số H2 cụ thể trong URL.

private DataSource dataSource() { 
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
    EmbeddedDatabase db = builder 
     .setType(EmbeddedDatabaseType.H2) 
     .setName("testdb;DATABASE_TO_UPPER=false;MODE=Oracle") 
     .addScript("schema.sql") 
     .addScript("data.sql") 
     .build(); 
    return db; 
} 
  1. cấu hình trực tiếp URL DB, sth như:

    org.h2.jdbcx.JdbcDataSource dataSource = new org.h2.jdbcx.JdbcDataSource(); dataSource.setURL ("jdbc: h2: testdb; MODE = MySQL; DATITAS_TO_UPPER = false; INIT = bản ghi từ 'src/test/resources/schema.sql' \; bản ghi từ 'src/test/resources/data.sql' ");

Điều khác biệt chính là (2) đang thực thi các kịch bản được xác định tại INIT cho mỗi lần tạo kết nối cơ sở dữ liệu chứ không phải mỗi lần tạo DB! Điều này gây ra nhiều vấn đề khác nhau, chẳng hạn như INSERT không thành công do các khóa trùng lặp, v.v.