3

トランザクションのコミットを処理しましたが、オブジェクトを保存した後、データベースは空のままです。エラーはありません。hibernate は挿入の SQL コマンドも表示します。hibernate config xml に行を追加するとすべて問題あり<property name="hibernate.connection.autocommit">true</property>ませんが、これは良い習慣ではないと聞きました。HSQLDB データベースを使用しています。

データを挿入するコードの一部を次に示します。

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Client c = new Client();
    c.setImie("John");
    c.setNazwisko("Kennedy"); 
    session.save(c);
    session.getTransaction().commit();
    session.close();
4

4 に答える 4

0

データベースにコミットする前に、 session.flush()を使用してオブジェクトをデータベースに保存するのを忘れた可能性があります(session.getTransaction().commit())。Hibernateリファレンス自体が述べているように:

このセッションを強制的にフラッシュします。トランザクションをコミットしてセッションを閉じる前に、作業単位の最後に呼び出す必要があります(フラッシュモードによっては、Transaction.commit()がこのメソッドを呼び出します)。

そしてまた:

「フラッシングとは、基盤となる永続ストアを、メモリに保持されている永続可能な状態と同期させるプロセスです。」

編集:

HSQLDBについて少し読んだ後、私はあなたに起こっている可能性のあるいくつかのことを見ました:

1-HSQLDBは​​デフォルトでは耐久性がないため(「ACID」からのD)、データをディスクにすぐに永続化することはありません。知っている。あまりかわいいではありません。したがって、最後の接続が終了したときに変更の書き込みを「強制」して、プロパティを設定する必要がありますshutdown=true。ユーザーガイドから:

shutdown = true接続プロパティを使用して、接続が閉じられた後もデータベースが完全に永続化されるようにすることができます。

2-変更をすぐにディスクに書き込むには、プロパティを使用しますhsqldb.write_delay=false;

したがって、接続文字列には次のようなものが含まれることになります。

;shutdown=true;hsqldb.write_delay=false;

それが役に立てば幸い!

于 2012-07-23T22:36:51.757 に答える
0

これらのいくつかは、状況によっては自動的に発生する可能性がありますが、自動的に実行するように構成されていない限り、次の順序で 3 つすべてを実行する必要があります。

  1. Session.save()JVM 内からオブジェクトの Hibernate のビューを更新します。
  2. Session.flush()SQL ステートメントを発行して、オブジェクトのデータベースのビューを更新します。
  3. Session.getTransaction().commit()データベースでトランザクションをコミットします。

http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Session.html#flush ()を参照してください。

于 2012-07-23T22:15:47.297 に答える
0

私の問題の解決策は、このスレッドリンクの質問の下にある最初のコメントに記載されています

于 2012-07-27T17:33:33.533 に答える