HSQLDB et Hibernate / JPA – ne pas persister sur le disque?

Quelque chose de novice avec HSQL et Hibernate …

em.getTransaction().begin(); for (Activity theActivity : activities) { em.persist(theActivity); } em.getTransaction().commit(); em.close(); 

suivi par…

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

Imprime 25000 (le nombre d’objects d’activité dans les activités). Mais lorsque je relance ce test, le nombre d’objects dans le décompte (*) n’augmente pas (et vaut 0 au début du programme). Les objects ne sont donc pas écrits durablement.

Ceci est ma chaîne de connexion hsqldb:

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

donc ce n’est pas une firebase database en mémoire pour autant que je sache …

Quelqu’un at-il des idées pour lesquelles les objects ne sont pas conservés au-delà d’une seule session JVM? Heureux de fournir plus d’informations, mais il y a tellement d’états associés à Hibernate / JPA / HSQL qu’il est difficile de savoir exactement ce qui est pertinent.

Quelqu’un a-t-il une idée de la raison pour laquelle les objects ne sont pas persistants au-delà d’une seule session JVM?

HSQLDB n’écrit pas les modifications immédiatement sur le disque après un commit (voir ” WRITE DELAY “), HSQLDB n’est pas durable par défaut (d’où proviennent les “performances”).

Essayez de définir la propriété de connexion shutdown=true dans la chaîne de connexion pour obtenir les modifications écrites à la fin de la dernière connexion.

 jdbc:hsqldb:file:data/cmon;shutdown=true 

Si cela ne vous aide pas, essayez de définir le WRITE DELAY sur 0 (ou faux). Si vous utilisez HSQLDB 1.8.x, utilisez la commande SQL:

 SET WRITE_DELAY 0 

Si vous utilisez HSQLDB 2.0.x, vous pouvez maintenant utiliser une propriété de connexion hsqldb.write_delay :

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

La solution est:

 org.hibernate.dialect.HSQLDialect 

dans hibernate.cfg.xml


Ceci est rest de ma configuration:

Libs:

  • HsqlDb 2.0.0
  • Hibernate 3.5.6

URL:

 jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false; 

Avez-vous défini hibernate.hbm2ddl.auto pour create-drop dans votre persistence.xml? Cela supprime vos tables et les recrée à chaque démarrage.

Vous pouvez le configurer pour le update à update ou si vous souhaitez gérer le schéma vous-même, puis le configurer pour le validate .

Fermez simplement votre EntityManagerFactory avec HSQL dans filemode, après la validation pour vraiment conserver les données …

J’utilisais la version HSQL DB 2.2.5. J’ai essayé les approches ci-dessus, c’est-à-dire en définissant shutdown = true et hsqldb.write_delay = false. Cela n’a pas fonctionné. Comme suggéré dans certains blogs, j’ai ajouté une déclaration

 org.hsqldb.DatabaseManager.closeDatabases(0); 

après validation de la transaction. Mais cela n’a pas fonctionné.

HSQL DB version 2.2.9 semble mieux que cela. Avec une solution de contournement, il résout ce problème. Pour traiter le problème ci-dessus, suivez les étapes suivantes: –

1) hsqldb.jar de la librairie HSQL DB version 2.2.9

2) Dans hibernate config xml, spécifiez simplement l’URL J’utilise la firebase database basée sur les fichiers HSQL.

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

3) Dans votre programme à la fin de la déclaration d’écriture

 org.hsqldb.DatabaseManager.closeDatabases(0); 

Exécutez maintenant le programme d’hibernation qui valide les données sur la firebase database.

Vérifiez la firebase database HSQL en l’ouvrant en mode autonome et avec une URL.

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

Vous devriez voir vos modifications persistées dans DB.

La session de fermeture a fonctionné pour moi.