Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HSQLDB和Hibernate/JPA-不持久化到磁盘?_Java_Hibernate_Jpa_Hsqldb - Fatal编程技术网

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

Java HSQLDB和Hibernate/JPA-不持久化到磁盘?,java,hibernate,jpa,hsqldb,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.

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

这是我的hsqldb连接字符串:

name="hibernate.connection.url" value="jdbc:hsqldb:file:data/cmon"
就我所知,它不是一个内存数据库


有人知道为什么对象在一个JVM会话之外没有得到持久化吗?很高兴提供更多信息,但是Hibernate/JPA/HSQL有太多的相关状态,所以不清楚到底什么是相关的。

您是否在persistence.xml中将
Hibernate.hbm2ddl.auto
设置为
create drop
?这会删除表并在每次启动时重新创建它们

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

有人知道为什么对象在一个JVM会话之外没有得到持久化吗

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

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

jdbc:hsqldb:file:data/cmon;shutdown=true
如果没有帮助,请尝试将设置为0(或false)。如果您使用的是HSQLDB1.8.x,请使用SQL命令:

SET WRITE_DELAY 0
如果您使用的是HSQLDB2.0.x,现在还可以使用连接
HSQLDB.write\u delay

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

解决方案是:

<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
org.hibernate.dialent.hsql方言
在hibernate.cfg.xml中


这是我的其余配置:

Libs:

  • HSQLDB2.0.0
  • 休眠3.5.6
网址:

jdbc:hsqldb:file:data/mydb;关机=真;hsqldb.write_delay=false;

在提交真正持久化数据之后,只需在文件模式下使用HSQL关闭EntityManagerFactory…

我使用的是HSQL DB版本2.2.5。 我尝试了上述方法,即设置shutdown=true和hsqldb.write\u delay=false 它不起作用。正如在一些博客中建议的那样,我添加了一个声明

org.hsqldb.DatabaseManager.closeDatabases(0);
事务提交后。但它没有起作用

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

1) hsqldb版本2.2.9库中的hsqldb.jar

2) 在hibernate配置xml中,只需指定URL 我使用的是基于HSQL文件的数据库

 <property name="hibernate.connection.url">jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB</property>
现在运行hibernate程序,将数据提交到DB

通过以独立模式打开HSQL DB并使用URL检查它

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

您应该可以在DB中看到您的更改。

关闭会话工厂对我很有效。

谢谢-它设置为“更新”,所以我不确定这是否是问题:(谢谢,我会试试。所以提交事务似乎不能保证持久性——这有点违反直觉。@HenryR:没错,默认情况下HSQLDB不持久。(实际上,HSQLDB不是(C)ID)@Pascal Thivent-谢谢,不幸的是,这似乎不起作用。我的连接字符串是jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=0;shutdown=true,仍然没有持久性(hbm2ddl.auto仍然设置为“update”)@HenryR:我添加了一个类似问题的链接(我在写答案时找不到该链接)。我相信这是同一个“问题”。明天将对此进行测试。匿名用户的编辑无效:最终在应用程序退出之前关闭EntityManagerFactory(emf.close()),并刷新对磁盘的更改:EntityManagerFactory emf;//设置emf//保留某些实体emf.close();作为另一个数据点,上次运行的插入内容位于data/cmon.log中,在启动时会被删除并替换。也许有一个选项可以在启动时强制日志重播?这意味着日志记录确实会发生。请报告该目录中.log和任何.script文件的大小。还有您正在使用的HSQLDB版本。@fredt-Hibernate 1.8.0。该文件的日志大小约为4MB,大约有37000条insert语句。cmon.script为1.9K,奇怪的是,它以SET WRITE_DELAY 10结尾-这使得我对连接字符串所做的更改看起来好像不起作用。HSQLDB 1.8.0不支持连接属性。最新的Hibernate 3.5.5(2010.08.18)该版本支持HSQLDB2.0.x。将其与最新的HSQLDB2.0.1快照jar结合使用,并使用jdbc:HSQLDB:file:data/cmon;HSQLDB.write_delay=true;shutdown=true@HenryR:你曾经让它工作过吗?我遇到了完全相同的问题。日志被写入,但没有数据。你让我很开心,这个问题花费了我几个小时。+1和谢谢:)在我使用HSQL DB 2.2.4时为我工作。非常感谢!
org.hsqldb.DatabaseManager.closeDatabases(0);
jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB