1

ORMLite を使用して新しい H2 データベースを作成すると、データベース ファイルが作成されますが、アプリケーションを閉じると、データベースに保存されていたすべてのデータが失われます。

JdbcConnectionSource connection =
   new JdbcConnectionSource("jdbc:h2:file:" + path.getAbsolutePath() + ".h2.db");
TableUtils.createTable(connection, SomeClass.class);
Dao<SomeClass, Integer> dao = DaoManager.createDao(connection, SomeClass.class);
SomeClass sc = new SomeClass(id, ...);
dao.create(sc);
SomeClass retrieved = dao.queryForId(id);
System.out.println("" + retrieved);

このコードは良い結果をもたらします。保存したオブジェクトを印刷します。しかし、今度はテーブルを作成せずに新しいオブジェクトを保存せずにアプリケーションを再起動すると、必要なテーブルが存在しないという例外が発生します。

JdbcConnectionSource connection =
   new JdbcConnectionSource("jdbc:h2:file:" + path.getAbsolutePath() + ".h2.db");
Dao<SomeClass, Integer> dao = DaoManager.createDao(connection, SomeClass.class);
SomeClass  retrieved = dao.queryForId(id); // will produce an exception..
System.out.println("" + retrieved); 
4

2 に答える 2

1

createTable以下は、オフにして1回実行した後、2回実行するとうまくいきました。もちろん、2番目の挿入では主キー違反が発生しましたが、それは予想されていました。(@Thomasが述べたように)「.h2.db.h2.db」プレフィックスでファイルを作成しました。

いくつかの質問:

  1. アプリケーションを初めて実行した後、pathファイルが作成されているのがわかりますか?
  2. OSによってクリアされた一時的な場所ではなく、永続的なストレージにありますか?
  3. データベース コードが開始される前に、アプリケーションの他の部分がそれをクリアしている可能性はありますか?

お役に立てれば。

@Test
public void testStuff() throws Exception {
    File path = new File("/tmp/x");
    JdbcConnectionSource connection = new JdbcConnectionSource("jdbc:h2:file:"
        + path.getAbsolutePath() + ".h2.db");
    // TableUtils.createTable(connection, SomeClass.class);
    Dao<SomeClass, Integer> dao = DaoManager.createDao(connection,
        SomeClass.class);
    int id = 131233;
    SomeClass sc = new SomeClass(id, "fopewjfew");
    dao.create(sc);
    SomeClass retrieved = dao.queryForId(id);
    System.out.println("" + retrieved);
    connection.close();
}

私は私の家からロシアを見ることができます:

> ls -l /tmp/
...
-rw-r--r--  1 graywatson  wheel  14336 Aug 31 08:47 x.h2.db.h2.db
于 2011-08-31T12:54:56.287 に答える
0

データベースを閉じましたか? 自動的に閉じられますが、手動で閉じたほうがよいです (回復が速くなります)。

多くの場合、データベース URL が問題です。どちらの場合も同じパスが使用されていますか? そうしないと、2 つのデータベースになってしまいます。ちなみに、「.h2.db」は自動で追加されるので手動で追加する必要はありません。

問題をより適切に分析する;TRACE_LEVEL_FILE=2には、データベースの URL に追加し、データベース*.trace.dbに対して実行された SQL ステートメントをファイルで確認します。

于 2011-08-31T09:30:19.990 に答える