2012-02-07 34 views
9

H2 tiene un rango de compatibility modes para varias otras bases de datos como MS SQL Server, MySQL, Oracle, etc. que admiten dialectos SQL diferentes. Sin embargo, al configurar un embedded database en Spring, no encuentro ninguna configuración correspondiente. ¿Esto implica que tengo que usar SQL "simple" sin características específicas de dialecto si, por ejemplo, uso Oracle en producción y H2 durante la prueba? ¿He pasado por alto algo?¿La base de datos incrustada de Spring admite dialectos SQL diferentes?

Respuesta

9

Según el H2 doc, el modo de compatibilidad de Oracle es bastante limitado.

Por ejemplo, no puede usar procedimientos PL/SQL.

Si usa Spring's EmbeddedDatabase, no puede establecer el modo de compatibilidad tal como está; tiene que implementar su propio EmbeddedDatabaseConfigurer y especificar el modo de compatibilidad a través de la URL JDBC (ver a continuación).

Pero también, para utilizar el modo de compatibilidad con H2 y la primavera, sólo hay que ajustar el modo en que su URL de JDBC (por lo que no es la primavera relacionado) de una manera clásica, utilizando una fuente de datos:

jdbc:h2:~/test;MODE=Oracle 

Y si usa Hibernate, debe especificar el dialecto de Oracle en lugar del H2.

10

¿qué versión de la base de datos H2? por la documentación, se puede establecer el modo de compatibilidad de SQL (http://www.h2database.com/html/features.html#compatibility)

SET MODE PostgreSQL 

sólo tiene que añadir esta declaración en su primer archivo de secuencia de comandos SQL cargado por JDBC primavera embebido en la base de datos

0

Tienes 2 opciones:

  1. uso de primavera para iniciar la base de datos H2 de la siguiente manera (marque setName() para ver cómo pasar parámetros de URL específica H2 a la primavera constructor):

código de primavera genera la URL de la siguiente manera:

String.Format ("jdbc: H2: mem:% s; DB_CLOSE_DELAY = -1", de databaseName)

Así, en setName() que pueda todo lo que cualquier Parámetro específico H2 en la 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. configure directamente la URL DB, algo así como:

    org.h2.jdbcx.JdbcDataSource dataSource = new org.h2.jdbcx.JdbcDataSource(); dataSource.setURL ("jdbc: h2: testdb; MODE = MySQL; DATABASE_TO_UPPER = false; INIT = runscript desde 'src/test/resources/schema.sql' \; runscript desde 'src/test/resources/data.sql' ");

La principal diferente es que (2) es la ejecución de scripts definidos en INIT para cada conexión creación de bases de datos y no una vez por la creación DB! Esto causa varios problemas, como INSERT que falla debido a la duplicación de claves, etc.

Cuestiones relacionadas