具有持久性h2 db的ormlite - 新表不会被持久化

时间:2011-08-31 09:20:28

标签: java h2 ormlite

当我通过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); 

2 个答案:

答案 0 :(得分:1)

如果我运行一次然后第二次关闭createTable,则以下工作正常。第二个插件当然给了我一个主要的密钥违规,但这是预期的。它创建了一个文件(如@Thomas提到的)一个“.h2.db.h2.db”前缀。

有些问题:

  1. 第一次运行应用程序后,您能看到正在创建的path文件吗?
  2. 是否在永久存储中,而不是在操作系统清除的某个临时位置?
  3. 您的应用程序的其他部分是否有机会在数据库代码开始之前清除它?
  4. 希望这有帮助。

    @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
    

答案 1 :(得分:0)

你关闭了数据库吗?它会自动关闭,但最好手动关闭(因此恢复速度更快)。

在许多情况下,数据库URL就是问题所在。你确定两种情况都使用相同的路径吗?否则你最终得到两个数据库。顺便说一句,“。h2.db”会自动添加,您无需手动添加。

为了更好地分析问题,您可以将;TRACE_LEVEL_FILE=2附加到数据库URL,然后在*.trace.db文件中检查对数据库执行了哪些SQL语句。