java hibernate jpa hsqldb

java - HSQLDB e Hibernate/JPA: ¿no persiste en el disco?



(6)

Algo de un principiante con HSQL e Hibernate ...

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

seguido por...

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

Imprime 25000 (el número de objetos de actividad en actividades). Pero cuando vuelvo a ejecutar esta prueba, la cantidad de objetos en el conteo (*) no aumenta (y es 0 al comienzo del programa). Entonces los objetos no se escriben de forma duradera.

Esta es mi cadena de conexión hsqldb:

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

así que no es una base de datos en memoria por lo que sé ...

¿Alguien tiene alguna idea de por qué los objetos no persisten más allá de una sola sesión de JVM? Feliz de proporcionar más información, pero hay tanto estado asociado con Hibernate / JPA / HSQL que no está claro exactamente lo que es pertinente.


¿Alguien tiene alguna idea de por qué los objetos no persisten más allá de una sola sesión de JVM?

HSQLDB no escribe los cambios inmediatamente en el disco después de una confirmación (ver " DEMORA DE ESCRITURA "), HSQLDB no es Durable por defecto (de donde provienen las "actuaciones").

Intente establecer la propiedad de conexión shutdown=true en la cadena de conexión para obtener los cambios escritos cuando termine la última conexión.

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

Si no ayuda, intente configurar el RETARDO DE ESCRITURA a 0 (o falso). Si está utilizando HSQLDB 1.8.x, use el comando SQL:

SET WRITE_DELAY 0

Si está utilizando HSQLDB 2.0.x, ahora también puede usar una property conexión hsqldb.write_delay :

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


¿Estableciste hibernate.hbm2ddl.auto para create-drop en tu persistence.xml? Esto suelta sus tablas y las vuelve a crear en cada inicio.

Puede configurarlo para update lugar, o si desea administrar el esquema usted mismo, configúrelo para validate .


Cerrar sessionfactory funcionó para mí.


Estaba usando HSQL DB versión 2.2.5. Intenté los enfoques anteriores, es decir, establecer shutdown = true y hsqldb.write_delay = false No funcionó. Como se sugiere en algunos blogs, agregué el enunciado

org.hsqldb.DatabaseManager.closeDatabases(0);

después de la transacción commit. Pero no funcionó.

HSQL DB versión 2.2.9 parece mejor que esto. Con una solución, resuelve este problema. Para manejar el problema anterior, siga los siguientes pasos:

1) hsqldb.jar desde lib de HSQL DB versión 2.2.9

2) En hibernate config xml simplemente especifique URL. Estoy usando una base de datos basada en archivos HSQL.

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

3) En su programa al final escriba la declaración

org.hsqldb.DatabaseManager.closeDatabases(0);

Ahora ejecute el programa de hibernación que envía los datos a DB.

Compruebe HSQL DB abriéndolo en modo independiente y con URL

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

Debería ver sus cambios persisten en DB.


Simplemente cierre su EntityManagerFactory con HSQL en modo de archivo, después del compromiso de realmente persistir datos ...


La solucion es :

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

en hibernate.cfg.xml

Este es el resto de mi configuración:

Libs:

  • HsqlDb 2.0.0
  • Hibernate 3.5.6

Url:

<property name="connection.url">jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false;</property>