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

Hen*_*ryR 25 java hibernate jpa hsqldb

HSQL和Hibernate的新手......

em.getTransaction().begin();
for (Activity theActivity : activities) {
  em.persist(theActivity);
}
em.getTransaction().commit();
em.close();
Run Code Online (Sandbox Code Playgroud)

其次是...

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

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

这是我的hsqldb连接字符串:

name="hibernate.connection.url" value="jdbc:hsqldb:file:data/cmon"
Run Code Online (Sandbox Code Playgroud)

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

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

Pas*_*ent 29

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

提交后HSQLDB不会立即将更改写入磁盘(请参阅" WRITE DELAY "),默认情况下HSQLDB不耐用(来自"性能"的来源).

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

jdbc:hsqldb:file:data/cmon;shutdown=true
Run Code Online (Sandbox Code Playgroud)

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

SET WRITE_DELAY 0
Run Code Online (Sandbox Code Playgroud)

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

jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=false
Run Code Online (Sandbox Code Playgroud)

  • 无效 匿名用户编辑:最后在应用程序退出之前关闭 EntityManagerFactory (emf.close()) 也会将更改刷新到磁盘: EntityManagerFactory emf; //设置emf //保存一些实体 emf.close(); (2认同)

Mac*_*eft 9

解决方案是:

<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
Run Code Online (Sandbox Code Playgroud)

在hibernate.cfg.xml中


这是我配置的其余部分:

库:

  • HsqlDb 2.0.0
  • Hibernate 3.5.6

网址:

<property name="connection.url">jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false;</property>
Run Code Online (Sandbox Code Playgroud)

  • 为什么这样才能解决问题? (4认同)

Chr*_*her 7

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

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