H2インメモリデータベースは、JVM内のメモリにデータを格納します。JVMが終了すると、このデータは失われます。
あなたがやっていることは、以下の2つのJavaクラスに似ていると思います。これらのクラスの1つはテーブルを作成し、もう1つはそのテーブルへの挿入を試みます。
import java.sql.*;
public class CreateTable {
public static void main(String[] args) throws Exception {
DriverManager.registerDriver(new org.h2.Driver());
Connection c = DriverManager.getConnection("jdbc:h2:mem:test");
PreparedStatement stmt = c.prepareStatement("CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64))");
stmt.execute();
stmt.close();
c.close();
}
}
そして
import java.sql.*;
public class InsertIntoTable {
public static void main(String[] args) throws Exception {
DriverManager.registerDriver(new org.h2.Driver());
Connection c = DriverManager.getConnection("jdbc:h2:mem:test");
PreparedStatement stmt = c.prepareStatement("INSERT INTO PERSON (ID, FIRSTNAME, LASTNAME) VALUES (1, 'John', 'Doe')");
stmt.execute();
stmt.close();
c.close();
}
}
これらのクラスを次々と実行すると、次の出力が得られました。
C:\ Users \ Luke \ stuff> java CreateTable
C:\ Users \ Luke \ stuff> java InsertIntoTable
スレッド "main"での例外org.h2.jdbc.JdbcSQLException:テーブル "PERSON"が見つかりません。SQLステートメント:
INSERT INTO PERSON(ID、FIRSTNAME、LASTNAME)VALUES(1、 'John'、 'Doe')[42102-154]
org.h2.message.DbException.getJdbcSQLException(DbException.java:327)で
org.h2.message.DbException.get(DbException.java:167)で
org.h2.message.DbException.get(DbException.java:144)で
...
最初のjava
プロセスが終了するとすぐに、によって作成されたテーブルはCreateTable
存在しなくなります。したがって、InsertIntoTableクラスが追加されたとき、それを挿入するためのテーブルはありません。
接続文字列をに変更したjdbc:h2:test
ところ、そのようなエラーは発生しませんでした。また、ファイルtest.h2.db
が表示されていたことがわかりました。これは、H2がテーブルを配置した場所であり、ディスクに格納されていたため、InsertIntoTableクラスが検索するためにテーブルはまだそこにありました。
Person
再度作成する必要があります。H2は、以前にディスク上に作成したデータベースについて何も知りません。