2010-08-23 8 views
24

Etwas von einem Anfänger mit HSQL und Hibernate ...HSQLDB und Hibernate/JPA - nicht persistent auf Festplatte?

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

von ...

gefolgt
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 (die Anzahl der Aktivitätsobjekte in Aktivitäten). Aber wenn ich diesen Test erneut durchführe, erhöht sich die Anzahl der Objekte in der Zählung (*) nicht (und ist am Anfang des Programms 0). So werden die Objekte nicht dauerhaft geschrieben.

Das ist meine hsqldb Verbindungszeichenfolge:

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

es ist also nicht eine In-Memory-Datenbank, soweit ich weiß ...

Hat jemand irgendwelche Ideen, warum die Objekte nicht bekommen über eine einzige JVM-Sitzung hinaus bestehen? Ich freue mich, mehr Informationen zu liefern, aber es gibt so viele Zustände, die mit Hibernate/JPA/HSQL verbunden sind, dass nicht klar ist, was genau dazugehört.

+0

Als ein weiterer Datenpunkt befinden sich die INSERTs des letzten Laufs in der Datei data/cmon.log, die beim Start gelöscht und ersetzt wird. Vielleicht gibt es eine Option, um die Protokollwiedergabe beim Start zu erzwingen? – HenryR

+0

Dies bedeutet, dass die Protokollierung stattfindet. Bitte melden Sie die Größe der .log-Datei und einer beliebigen .script-Datei in diesem Verzeichnis. Auch die Version von HSQLDB, die Sie verwenden. – fredt

+0

@fredt - Hibernate 1.8.0. Die Größe des Protokolls beträgt ca. 4 MB, ca. 37000 Einfügeanweisungen. cmon.script ist 1.9K und endet seltsamerweise mit SET WRITE_DELAY 10 - was es so aussehen lässt, als ob meine Änderungen an der Verbindungszeichenfolge nicht funktionieren. – HenryR

Antwort

29

Hat jemand irgendwelche Ideen, warum die Objekte nicht über eine einzige JVM-Sitzung hinaus bestehen bleiben?

HSQLDB schreiben keine Änderungen sofort auf der Festplatte nach einem Commit (siehe „WRITE DELAY“), HSQLDB ist nicht haltbar standardmäßig (das ist aus der ‚Performance‘ kommt aus).

Entweder versuchen Sie, die Verbindungseigenschaft shutdown=true in der Verbindungszeichenfolge festzulegen, um die Änderungen zu erhalten, die geschrieben werden, wenn die letzte Verbindung beendet wird.

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

Wenn es nicht hilft, versuchen Sie die WRITE DELAY-0 (oder falsch) zu setzen. Wenn Sie HSQLDB 1.8.x verwenden, verwenden Sie den SQL-Befehl:

SET WRITE_DELAY 0 

Wenn Sie HSQLDB 2.0.x verwenden, können Sie jetzt auch eine Verbindung propertyhsqldb.write_delay:

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

Danke, ich werde das versuchen. Also eine Transaktion zu verpflichten garantiert keine Persistenz, es scheint - das ist ein bisschen kontra intuitiv. – HenryR

+0

@HenryR: Das ist genau das, HSQLDB ist nicht haltbar ** standardmäßig **. (HSQLDB ist eigentlich keine A (C) ID). –

+0

@Pascal Thivent - danke, leider scheint das nicht geklappt zu haben.Meine Verbindungszeichenfolge ist jdbc: hsqldb: file: data/cmon; hsqldb.write_delay = 0; shutdown = true und es gibt immer noch keine Haltbarkeit (hbm2ddl.auto ist immer noch auf 'update' eingestellt) – HenryR

7

Haben Sie in Ihrer persistence.xml hibernate.hbm2ddl.auto auf create-drop gesetzt? Dadurch werden Ihre Tabellen gelöscht und bei jedem Start neu erstellt.

Sie können stattdessen update festlegen, oder wenn Sie das Schema selbst verwalten möchten, setzen Sie es auf validate.

+1

Danke - es ist auf "update" eingestellt, so bin ich mir nicht sicher, ob das das Problem ist :( – HenryR

9

die Lösung lautet:

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

in hibernate.cfg.xml

Dies ist Rest meiner Konfiguration:

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> 
+0

Du hast meinen Tag gemacht, dieses Problem hat mich einige Stunden gekostet. +1 und danke :) – BitSchupser

+0

Arbeitete für mich, wie ich HSQL DB 2.2.4 verwende. Vielen vielen Dank! – mvmn

+3

Warum löst das das Problem? –

3

einfach Ihre EntityManagerFactory mit HSQL in Dateimodus schließen, nach dem sich verpflichten, wirklich Daten zu bestehen ...

3

Ich war mit HSQL DB-Version 2.2.5. Ich versuchte oben Ansätze, d. H. Einstellung shutdown = True und hsqldb.write_delay = false Es hat nicht funktioniert. Wie in einigen Blogs vorgeschlagen, fügte ich die Anweisung

org.hsqldb.DatabaseManager.closeDatabases(0); 

nach Transaktion Commit. Aber es hat nicht funktioniert.

HSQL DB Version 2.2.9 scheint besser als das. Mit einem Workaround löst es dieses Problem. Um obiges Problem zu umgehen nehmen wie folgt vorgehen: -

1) hsqldb.jar von lib von HSQL DB Version 2.2.9

2) In Hibernate Config xml nur angeben URL Ich bin mit HSQL dateibasierte Datenbank.

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

3) In Ihrem Programm am Ende write-Anweisung

org.hsqldb.DatabaseManager.closeDatabases(0); 

nun das Hibernate-Programm ausführen, das die Daten an die DB verpflichtet.

prüfen HSQL DB durch im Standalone-Modus und mit URL öffnen

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

Sie sollten Ihre Änderungen beibehalten in DB sehen.

1

Schließen semicefactory arbeitete für mich.