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的状态如此之多,以至于不清楚究竟是什么相关的。
答案 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
中这是我配置的其余部分:
利布斯:
地址:
<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 为我工作。