2011-08-31 62 views
1

当我通过ORMLite创建一个新的H2数据库时,数据库文件被创建,但在关闭我的应用程序后,它存储在数据库中的所有数据都将丢失:ormlite with persistent h2 db - 新表格没有得到保存

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

回答

0

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

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

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

+0

我正在关闭连接: (的Connection.close) 我敢肯定,我使用相同的路径.. 我甚至印它。 – bennylu

1

以下工作适合我,如果我跑了一次,然后第二次关闭createTable。第二次插入给我一个主要的违反当然,但这是预期的。它创建了(如@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

我也可以看到这个文件,但在我的版本中它的空 我创建了一个只有这个代码的新主体,结果保持不变 - 您使用的是什么版本的h2/ormlite? – bennylu

+0

我使用ORMLite的4.25和H2的1.2.128。也许一个愚蠢的问题,但我认为你有足够的磁盘空间。如果文件长度为0,那么有些东西是非常错误的。这是什么操作系统? – Gray

+0

我在Windows 7上运行与您的版本相同的版本.. ,但仍然不能得到它的工作,我切换到javaDB和一切工作正常 - 不知道是什么原因,与H2相同的代码没有工作 – bennylu