web-dev-qa-db-ja.com

HSQLDBとHibernate / JPA-ディスクに永続化されていませんか?

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(アクティビティ内のアクティビティオブジェクトの数)を出力します。しかし、このテストを再度実行すると、count(*)内のオブジェクトの数は増えません(プログラムの開始時には0です)。そのため、オブジェクトは永続的に書き込まれていません。

これは私のhsqldb接続文字列です:

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

だから私が知る限り、それはインメモリデータベースではありません...

オブジェクトが単一のJVMセッションを超えて永続化されない理由を誰かが知っていますか?より多くの情報を提供できてうれしいですが、Hibernate/JPA/HSQLに関連する状態が非常に多いため、何が適切であるかが明確ではありません。

25
HenryR

オブジェクトが単一のJVMセッションを超えて永続化されない理由を誰かが知っていますか?

HSQLDBは​​、コミット後すぐに変更をディスクに書き込みません( " WRITE DELAY "を参照)。HSQLDBは​​デフォルトではDurableではありません(これは「パフォーマンス」の出所です)。

接続プロパティを設定してみてください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を使用している場合は、接続も使用できるようになりました propertyhsqldb.write_delay

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

解決策は:

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

hibernate.cfg.xmlで


これは私の構成の残りです:

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>
9
Maciek Kreft

設定しましたかhibernate.hbm2ddl.autoからcreate-dropあなたのpersistence.xmlに?これにより、テーブルが削除され、起動するたびにテーブルが再作成されます。

代わりにupdateに設定できます。スキーマを自分で管理する場合は、validateに設定します。

7
Chris Lercher

HSQLDBバージョン2.2.5を使用していました。上記のアプローチを試しました。つまり、shutdown = trueとhsqldb.write_delay = falseを設定しました。機能しませんでした。いくつかのブログで示唆されているように、私は声明を追加しました

org.hsqldb.DatabaseManager.closeDatabases(0);

トランザクションのコミット後。しかし、それは機能しませんでした。

HSQLDBバージョン2.2.9はこれよりも優れているようです。 1つの回避策で、この問題を解決します。上記の問題を処理するには、次の手順を実行します:-

1)HSQLDBバージョン2.2.9のlibからのhsqldb.jar

2)Hibernate config xmlで、HSQLファイルベースのデータベースを使用しているURLを指定するだけです。

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

3)プログラムの最後にステートメントを書く

org.hsqldb.DatabaseManager.closeDatabases(0);

次に、データをDBにコミットするHibernateプログラムを実行します。

HSQL DBをスタンドアロンモードで開き、URLを使用して確認します

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

変更がDBに保持されていることを確認する必要があります。

4
Kaushik Lele

データを実際に永続化するためにコミットした後、ファイルモードでHSQLを使用してEntityManagerFactoryを閉じるだけです...

3
Jean-Luc

締めくくりsessionfactory私のために働いた。

1
Pradeep