HSQLDB和Hibernate / JPA – 没有持久化到磁盘?

HSQL和Hibernate的新手……

em.getTransaction().begin(); for (Activity theActivity : activities) { em.persist(theActivity); } em.getTransaction().commit(); em.close(); 

其次是…

 EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); System.out.println("QUERY:: " + em.createQuery("SELECT COUNT(*) FROM " + Activity.class.getName()).getSingleResult() .toString()); em.getTransaction().commit(); 

打印25000(活动中的Activity对象数)。 但是当我再次运行此测试时,count(*)中的对象数量不会增加(在程序开头时为0)。 所以对象没有得到持久的写作。

这是我的hsqldb连接字符串:

 name="hibernate.connection.url" value="jdbc:hsqldb:file:data/cmon" 

所以据我所知,它不是内存数据库……

有没有人有任何想法为什么对象不会持久超过单个JVM会话? 很高兴提供更多信息,但是与Hibernate / JPA / HSQL相关的状态如此之多,以至于不清楚究竟是什么相关的。

有没有人有任何想法为什么对象不会持久超过单个JVM会话?

提交后HSQLDB不会立即将更改写入磁盘(请参阅“ WRITE DELAY ”),默认情况下HSQLDB不是持久的(来自“性能”的来源)。

尝试在连接字符串中设置连接属性shutdown=true ,以获取上次连接结束时写入的更改。

 jdbc:hsqldb:file:data/cmon;shutdown=true 

如果没有帮助,请尝试将WRITE DELAY设置为0(或false)。 如果您使用的是HSQLDB 1.8.x,请使用SQL命令:

 SET WRITE_DELAY 0 

如果您使用的是HSQLDB 2.0.x,现在还可以使用连接属性 hsqldb.write_delay

 jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=false 

解决方案是:

 org.hibernate.dialect.HSQLDialect 

在hibernate.cfg.xml中


这是我配置的其余部分:

库:

  • HsqlDb 2.0.0
  • Hibernate 3.5.6

url:

 jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false; 

你有没有将hibernate.hbm2ddl.auto设置为你的persistence.xml中的create-drop ? 这会丢弃您的表并在每次启动时重新创建它们。

您可以将其设置为update ,或者如果您想自己管理架构,则将其设置为validate

在提交真正持久化数据之后,只需在filemode中使用HSQL关闭EntityManagerFactory …

我使用的是HSQL DB 2.2.5版。 我试过上面的方法,即设置shutdown = true和hsqldb.write_delay = false它不起作用。 正如一些博客所说,我补充说

 org.hsqldb.DatabaseManager.closeDatabases(0); 

在事务提交之后。 但它没有用。

HSQL DB版本2.2.9似乎比这更好。 通过一种解决方法,它解决了这个问题。 要处理上述问题,请执行以下步骤: –

1)来自HSQL DB版本2.2.9的lib的hsqldb.jar

2)在hibernate config xml中只指定URL我使用的是基于HSQL文件的数据库。

  jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB 

3)在你的程序结束时写声明

 org.hsqldb.DatabaseManager.closeDatabases(0); 

现在运行将数据提交到DB的hibernate程序。

通过以独立模式和URL打开HSQL DB来检查它

 jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB 

您应该会在DB中看到您的更改仍然存在。

结账会议对我有用