Unterstützt die eingebettete Spring-database verschiedene SQL-Dialekte?

H2 bietet eine Reihe von Kompatibilitätsmodi für verschiedene andere databaseen wie MS SQL Server, MySQL, Oracle usw., die verschiedene SQL-Dialekte unterstützen. Beim Einrichten einer eingebetteten database in Spring finde ich jedoch keine entsprechende Einstellung. Bedeutet dies, dass ich “einfaches” SQL ohne irgendwelche dialektspezifischen functionen verwenden muss, wenn ich zum Beispiel Oracle in der Produktion und H2 während des Tests verwende? Habe ich etwas übersehen?

Laut dem H2-Doc ist der Oracle-Kompatibilitätsmodus ziemlich begrenzt.

Zum Beispiel können Sie keine PL / SQL-Prozeduren verwenden.

Wenn Sie Spring EmbeddedDatabase verwenden, können Sie den Kompatibilitätsmodus nicht ändern. Sie müssen Ihren eigenen EmbeddedDatabaseConfigurer implementieren und den Kompatibilitätsmodus über die JDBC-URL angeben (siehe unten).

Um jedoch den Kompatibilitätsmodus mit H2 und Spring zu verwenden, müssen Sie den Modus in Ihrer JDBC-URL (also nicht im Spring-Bezug) auf klassische Weise mithilfe einer DataSource festlegen:

jdbc:h2:~/test;MODE=Oracle 

Und wenn Sie Hibernate verwenden, müssen Sie den Oracle-Dialekt anstelle des H2-Dialekts angeben.

Welche Version der H2-database? In der Dokumentation können Sie den kompatiblen Modus per SQL-statement einstellen ( http://www.h2database.com/html/features.html#compatibility )

 SET MODE PostgreSQL 

Fügen Sie diese statement einfach in Ihre erste SQL-Skriptdatei ein, die von Spring jdbc embedded-database geladen wird

Sie haben 2 Möglichkeiten:

  1. Verwenden Sie spring, um die H2-database wie folgt zu starten (überprüfen Sie setName (), um zu erfahren, wie H2 spezifische URL-Parameter an Spring Builder übergeben werden):

Springcode generiert die URL wie folgt:

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

In setName () können Sie also alle H2 spezifischen Parameter in der URL eingeben.

 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. Konfigurieren Sie direkt die DB-URL, etwa so:

    org.h2.jdbcx.JdbcDataSource dataSource = neu org.h2.jdbcx.JdbcDataSource (); dataSource.setURL (“jdbc: h2: testdb; MODUS = MySQL; DATABASE_TO_UPPER = false; INIT = runscript von ‘src / test / resources / schema.sql’;; runscript von ‘src / test / resources / data.sql'” );

Der Hauptunterschied besteht darin, dass (2) Skripte ausführt, die bei INIT für jede databaseverbindungserstellung definiert sind, und nicht einmal pro DB-Erstellung! Dies führt zu verschiedenen Problemen, wie INSERTs wegen doppelter Schlüssel usw. fehlschlagen.