(Widziałem już bazę danych H2 w pamięci - schemat Init za pomocą pytania Spring / Hibernate ; nie ma tutaj zastosowania).
Chciałbym wiedzieć, czy w H2 jest ustawienie, które pozwoli mi automatycznie utworzyć schemat po połączeniu się z nim. Jeśli to pomoże, interesuje mnie tylko przypadek w pamięci.
H2 obsługuje różne modyfikatory oddzielone średnikami na końcu adresu URL, ale nie znalazłem takiego do automatycznego tworzenia schematu. Czy jest taka funkcja?
<property name="hibernate.connection.url">jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'script1.sql'\\\;RUNSCRIPT FROM script2.sql'</property>
w swojej konfiguracji hibernacji.;
to, że nie trzeba uciekać (;
przed znakiem znajduje się znak bez znaczeniaINIT
). Czy możesz spróbować, jeśli działa tylko jeden lewy ukośnik?'script1.sql'\;RUNSCRIPT...
Jeśli używasz spring z application.yml, poniższe będą działać dla Ciebie
spring: datasource: url: jdbc:h2:mem:mydb;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS calendar
źródło
To, co napisał Thomas, jest poprawne, oprócz tego, jeśli chcesz zainicjować wiele schematów, możesz użyć następującego. Zwróć uwagę, że
\\;
dwie instrukcje create są oddzielone.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();
ref: http://www.h2database.com/html/features.html#execute_sql_on_connection
źródło
„Domyślnie, gdy wywołuje się aplikacja,
DriverManager.getConnection(url, ...)
a baza danych określona w adresie URL jeszcze nie istnieje, tworzona jest nowa (pusta) baza danych.” - Baza danych H2 .Dodatek: @Thomas Mueller pokazuje, jak wykonać SQL przy połączeniu , ale czasami po prostu tworzę i wypełniam kod, jak zasugerowano poniżej.
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); } } }
źródło
Jeśli używasz Spring Framework z
application.yml
i masz problem ze znalezieniem przez test pliku SQL weINIT
właściwości, możesz użyćclasspath:
notacji.Na przykład, jeśli masz
init.sql
plik SQL nasrc/test/resources
, po prostu użyj :url=jdbc:h2:~/test;INIT=RUNSCRIPT FROM 'classpath:init.sql';DB_CLOSE_DELAY=-1;
źródło