当我通过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);
答案 0 :(得分:1)
如果我运行一次然后第二次关闭createTable
,则以下工作正常。第二个插件当然给了我一个主要的密钥违规,但这是预期的。它创建了一个文件(如@Thomas提到的)一个“.h2.db.h2.db”前缀。
有些问题:
path
文件吗?希望这有帮助。
@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语句。