(Я уже видел базу данных H2 в памяти - схема инициализации через вопрос Spring / Hibernate ; здесь она не применима.)
Я хотел бы знать, есть ли в H2 параметр, который позволит мне автоматически создавать схему при подключении к ней. Если это поможет, меня интересует только случай в памяти.
H2 поддерживает различные модификаторы, разделенные точкой с запятой, в конце URL-адреса, но я не нашел ни одного для автоматического создания схемы. Есть такая особенность?
<property name="hibernate.connection.url">jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'script1.sql'\\\;RUNSCRIPT FROM script2.sql'</property>
в своей конфигурации гибернации.;
не нужно экранировать (;
перед символом есть неэкранированныйINIT
). Не могли бы вы попробовать, если работает только одна обратная косая черта?'script1.sql'\;RUNSCRIPT...
Если вы используете spring с application.yml, для вас подойдет следующее:
spring: datasource: url: jdbc:h2:mem:mydb;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS calendar
источник
То, что написал Томас, правильно, в дополнение к этому, если вы хотите инициализировать несколько схем, вы можете использовать следующее. Обратите внимание, что
\\;
два оператора создания разделены.EmbeddedDatabase db = new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .setName("testDb;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=create " + "schema if not exists " + "schema_a\\;create schema if not exists schema_b;" + "DB_CLOSE_DELAY=-1;") .addScript("sql/provPlan/createTable.sql") .addScript("sql/provPlan/insertData.sql") .addScript("sql/provPlan/insertSpecRel.sql") .build();
ссылка: http://www.h2database.com/html/features.html#execute_sql_on_connection
источник
«По умолчанию, когда приложение вызывает,
DriverManager.getConnection(url, ...)
а база данных, указанная в URL, еще не существует, создается новая (пустая) база данных.» - База данных H2 .Приложение: @Thomas Mueller показывает, как выполнять SQL при подключении , но иногда я просто создаю и заполняю код, как предлагается ниже.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /** @see http://stackoverflow.com/questions/5225700 */ public class H2MemTest { public static void main(String[] args) throws Exception { Connection conn = DriverManager.getConnection("jdbc:h2:mem:", "sa", ""); Statement st = conn.createStatement(); st.execute("create table customer(id integer, name varchar(10))"); st.execute("insert into customer values (1, 'Thomas')"); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("select name from customer"); while (rset.next()) { String name = rset.getString(1); System.out.println(name); } } }
источник
Если вы используете Spring Framework
application.yml
и не можете заставить тест найти файл SQL вINIT
свойстве, вы можете использоватьclasspath:
обозначение.Например, если у вас есть
init.sql
файл SQLsrc/test/resources
, просто используйте :url=jdbc:h2:~/test;INIT=RUNSCRIPT FROM 'classpath:init.sql';DB_CLOSE_DELAY=-1;
источник