ormlite с постоянным h2 db - новые таблицы не сохраняются - PullRequest
1 голос
/ 31 августа 2011

Когда я создаю новую базу данных H2 через ORMLite, файл базы данных создается, но после закрытия приложения все данные, хранящиеся в базе данных, теряются:

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); 

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Следующее работает нормально для меня, если я запускаю его один раз, а затем второй раз с выключенным createTable. 2-ая ​​вставка дала мне нарушение основного ключа конечно, но это ожидалось. Он создал файл с (как упомянул @Thomas) префиксом ".h2.db.h2.db".

Некоторые вопросы:

  1. После первого запуска приложения вы видите, что создается файл path?
  2. Находится ли он в постоянном хранилище, а не в каком-то временном месте, очищенном ОС?
  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
0 голосов
/ 31 августа 2011

Вы закрыли базу данных?Он закрывается автоматически, но лучше закрыть его вручную (чтобы восстановление происходило быстрее).

Во многих случаях проблема заключается в URL базы данных.Вы уверены, что в обоих случаях используется один и тот же путь?В противном случае вы получите две базы данных.Кстати, «.h2.db» добавляется автоматически, вам не нужно добавлять его вручную.

Чтобы лучше проанализировать проблему, вы можете добавить ;TRACE_LEVEL_FILE=2 к URL-адресу базы данных, а затем проверитьв файле *.trace.db, какие операторы SQL были выполнены для базы данных.

...