Spring嵌入式数据库是否支持不同的SQL方言?

H2具有一系列兼容模式,适用于支持不同SQL方言的各种其他数据库,如MS SQL Server,MySQL,Oracle等。 但是,在Spring中设置嵌入式数据库时 ,我找不到任何相应的设置。 这是否意味着如果我在生产中使用Oracle而在测试期间使用H2,那么我必须使用没有任何方言特定function的“普通”SQL? 我忽略了什么吗?

根据H2 doc ,Oracle兼容模式非常有限。

例如,您不能使用PL / SQL过程。

如果使用Spring的EmbeddedDatabase,则无法按原样设置兼容模式; 您必须实现自己的EmbeddedDatabaseConfigurer并通过JDBC URL指定兼容模式(见下文)。

但是,要使用与H2和Spring的兼容模式,您只需使用DataSource以经典方式在JDBC URL中设置模式(因此它与Spring不相关):

jdbc:h2:~/test;MODE=Oracle 

如果你使用Hibernate,你必须指定Oracle方言而不是H2方言。

哪个版本的H2数据库? 根据文档,您可以通过SQL语句设置兼容模式( http://www.h2database.com/html/features.html#compatibility

 SET MODE PostgreSQL 

只需将此语句添加到Spring jdbc embedded-database加载的第一个sql脚本文件中

你有2个选择:

  1. 使用spring启动H2数据库,如下所示(检查setName()以查看如何将H2特定的URL参数传递给spring builder):

Spring代码生成URL如下:

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

因此,在setName()中,您可以使用URL中的所有H2特定参数。

 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. 直接配置DB URL,如:

    org.h2.jdbcx.JdbcDataSource dataSource = new org.h2.jdbcx.JdbcDataSource(); dataSource.setURL(“jdbc:h2:testdb; MODE = MySQL; DATABASE_TO_UPPER = false; INIT =来自’src / test / resources / schema.sql的脚本’\;来自’src / test / resources / data.sql’的脚本’” );

主要的不同之处在于(2)执行在INIT中为每个数据库连接创建定义的脚本,而不是每个数据库创建一次! 这会导致各种问题,例如INSERT由于重复键等而失败。