Reputation: 8519
Something of an novice with HSQL and Hibernate...
em.getTransaction().begin();
for (Activity theActivity : activities) {
em.persist(theActivity);
}
em.getTransaction().commit();
em.close();
followed by...
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
System.out.println("QUERY:: "
+ em.createQuery("SELECT COUNT(*) FROM " + Activity.class.getName()).getSingleResult()
.toString());
em.getTransaction().commit();
Prints 25000 (the number of Activity objects in activities). But when I run this test again, the number of objects in the count(*) doesn't increase (and is 0 at the beginning of the program). So the objects aren't getting durably written.
This is my hsqldb connection string:
name="hibernate.connection.url" value="jdbc:hsqldb:file:data/cmon"
so it's not an in-memory database as far as I know...
Does anyone have any ideas why the objects aren't getting persisted beyond a single JVM session? Happy to supply more information but there's so much state associated with Hibernate / JPA / HSQL that it's not clear exactly what is pertinent.
Upvotes: 26
Views: 24281
Reputation: 6637
I was using HSQL DB version 2.2.5. I tried above approaches i.e. setting shutdown=true and hsqldb.write_delay=false It did not work. As suggested in some blog, I added statement
org.hsqldb.DatabaseManager.closeDatabases(0);
after transaction commit. But it did not work.
HSQL DB version 2.2.9 seems better than this. With one workaround it solves this problem. To handle above problem take following steps :-
1) hsqldb.jar from lib of HSQL DB version 2.2.9
2) In hibernate config xml just specify URL I am using HSQL file-based database.
<property name="hibernate.connection.url">jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB</property>
3) In your program at the end write statement
org.hsqldb.DatabaseManager.closeDatabases(0);
Now run the hibernate program that commits the data to DB.
Check HSQL DB by opening it in standalone mode and with URL
jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB
You should see your changes persisted in DB.
Upvotes: 4
Reputation: 41
Simply close your EntityManagerFactory with HSQL in filemode, after the commit to really persist datas...
Upvotes: 4
Reputation: 892
The solution is :
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
in hibernate.cfg.xml
This is rest of my configuration:
Libs:
Url:
<property name="connection.url">jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false;</property>
Upvotes: 9
Reputation: 570285
Does anyone have any ideas why the objects aren't getting persisted beyond a single JVM session?
HSQLDB doesn't write changes immediately to disk after a commit (see "WRITE DELAY"), HSQLDB is not Durable by default (that's from where "performances" are coming from).
Either try to set the connection property shutdown=true
in the connection string to get the changes written when the last connection will end.
jdbc:hsqldb:file:data/cmon;shutdown=true
If it doesn't help, try to set the WRITE DELAY to 0 (or false). If you're using HSQLDB 1.8.x, use the SQL command:
SET WRITE_DELAY 0
If you're using HSQLDB 2.0.x, you can now also use a connection property hsqldb.write_delay
:
jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=false
Upvotes: 30
Reputation: 37778
Did you set hibernate.hbm2ddl.auto
to create-drop
in your persistence.xml? This drops your tables and re-creates them on every startup.
You can set it to update
instead, or if you want to manage the schema yourself, then set it to validate
.
Upvotes: 8