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

时间:2010-08-23 21:50:46

标签: java hibernate jpa hsqldb

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对象数)。但是当我再次运行此测试时,计数(*)中的对象数量不会增加(在程序开头时为0)。所以对象没有得到持久的写作。

这是我的hsqldb连接字符串:

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

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

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

6 个答案:

答案 0 :(得分:29)

  

有没有人知道为什么对象不会在单个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,现在还可以使用property hsqldb.write_delay连接:

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

答案 1 :(得分:9)

解决方案是:

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

在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>

答案 2 :(得分:7)

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

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

答案 3 :(得分:3)

在提交真正保留数据之后,只需在filemode中使用HSQL关闭EntityManagerFactory ...

答案 4 :(得分:3)

我使用的是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文件的数据库。

 <property name="hibernate.connection.url">jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB</property>

3)在你的程序结尾写声明

org.hsqldb.DatabaseManager.closeDatabases(0);

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

通过以独立模式和URL

打开HSQL DB来检查它
jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB

您应该会在数据库中看到您的更改。

答案 5 :(得分:1)

结束 sessionfactory 为我工作。