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 中 Activity 对象的数量)。但是当我再次运行这个测试时,count(*) 中的对象数量并没有增加(并且在程序开始时为 0)。所以对象没有被持久写入。
这是我的 hsqldb 连接字符串:
name="hibernate.connection.url" value="jdbc:hsqldb:file:data/cmon"
所以据我所知,它不是内存数据库...
有没有人知道为什么对象在单个 JVM session 之外没有被持久化?很高兴提供更多信息,但是与 Hibernate/JPA/HSQL 相关的状态太多了,不清楚到底什么是相关的。
最佳答案
Does anyone have any ideas why the objects aren't getting persisted beyond a single JVM session?
HSQLDB 不会在提交后立即将更改写入磁盘(请参阅“WRITE DELAY”),默认情况下 HSQLDB 不是 Durable(这是“性能”的来源)。
尝试在连接字符串中设置连接属性 shutdown=true
以获取在最后一个连接结束时写入的更改。
jdbc:hsqldb:file:data/cmon;shutdown=true
如果没有帮助,请尝试设置 WRITE DELAY为 0(或错误)。如果您使用的是 HSQLDB 1.8.x,请使用 SQL 命令:
SET WRITE_DELAY 0
如果您使用的是 HSQLDB 2.0.x,您现在还可以使用连接 property hsqldb.write_delay
:
jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=false
关于java - HSQLDB 和 Hibernate/JPA - 不持久化到磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551988/