HSQLDB 和 Hibernate/JPA - 不持久化到磁盘?

2022-09-01 18:27:19

有点像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(活动中活动对象的数量)。但是当我再次运行此测试时,count(*) 中的对象数不会增加(并且在程序开始时为 0)。因此,对象没有得到持久的编写。

这是我的 hsqldb 连接字符串:

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

所以据我所知,它不是一个内存数据库...

有没有人知道为什么对象没有在单个JVM会话之外持久化?很高兴提供更多信息,但是与Hibernate / JPA / HSQL相关的状态太多了,因此尚不清楚确切的相关内容。


答案 1

有没有人知道为什么对象没有在单个JVM会话之外持久化?

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

尝试在连接字符串中设置连接属性,以便在最后一个连接结束时写入更改。shutdown=true

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

如果它不起作用,请尝试将写入延迟设置为 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

答案 2

解决方案是:

<property name="dialect">org.hibernate.dialect.HSQLDialect</property>

处于休眠状态.cfg.xml


这是我配置的其余部分:

库:

  • HsqlDb 2.0.0
  • 休眠 3.5.6

网址:

<property name="connection.url">jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false;</property>

推荐