开发者

ormlite with persistent h2 db - new tables not get persisted

When I am creating a new H2 database via ORMLite the database file get created but after I close my application, all the data that it stored in the database is lost:

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 SomeClas开发者_StackOverflow社区s(id, ...);
dao.create(sc);
SomeClass retrieved = dao.queryForId(id);
System.out.println("" + retrieved);

This code will produce good results. It will print the object that I stored. But when I start the application again this time without creating the table and storing new object I get an exception telling me that the required table is not exists:

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


The following worked fine for me if I ran it once and then a second time with the createTable turned off. The 2nd insert gave me a primary key violation of course but that was expected. It created the file with (as @Thomas mentioned) a ".h2.db.h2.db" prefix.

Some questions:

  1. After you run your application the first time, can you see the path file being created?
  2. Is it on permanent storage and not in some temporary location cleared by the OS?
  3. Any chance some other part of your application is clearing it before the database code begins?

Hope this helps.

@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();
}

I can see Russia from my house:

> ls -l /tmp/
...
-rw-r--r--  1 graywatson  wheel  14336 Aug 31 08:47 x.h2.db.h2.db


Did you close the database? It is closed automatically but it's better to close it manually (so recovery is faster).

In many cases the database URL is the problem. Are you sure the same path is used in both cases? Otherwise you end up with two databases. By the way, ".h2.db" is added automatically, you don't need to add it manually.

To better analyze the problem, you could append ;TRACE_LEVEL_FILE=2 to the database URL, and then check in the *.trace.db file what SQL statements were executed against the database.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜