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に関連する状態が非常に多いため、何が適切であるかが明確ではありません。
オブジェクトが単一の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
解決策は:
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
hibernate.cfg.xmlで
これは私の構成の残りです:
Libs:
URL:
<property name="connection.url">jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false;</property>
設定しましたかhibernate.hbm2ddl.auto
からcreate-drop
あなたのpersistence.xmlに?これにより、テーブルが削除され、起動するたびにテーブルが再作成されます。
代わりにupdate
に設定できます。スキーマを自分で管理する場合は、validate
に設定します。
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に保持されていることを確認する必要があります。
データを実際に永続化するためにコミットした後、ファイルモードでHSQLを使用してEntityManagerFactoryを閉じるだけです...
締めくくりsessionfactory私のために働いた。