3

DB を手動で作成し、Hibernate ツールを使用して Pojo、DAO を生成しました。オブジェクトを作成してデータベースに永続化すると、正常に動作するように見えます

        DefinitionT def = new DefinitionT();
        def.setSelected(false);
        def.setValue(sqlEncode(definition));
        def.setWordId(wordT.getId());
        definitionTDao.persist(def);

これは私の persist() メソッドです

public void persist(Object o)
{
    try
    {
        hSession.persist(o);
        hSession.flush();
    }
    catch (Exception e)
    {
        hTransaction.rollback();
        log.error(e.getMessage());
    }
}

スレッドが完了すると、データベースが新しいオブジェクトで更新されます。ただし、persist() を呼び出した直後にプログラムを停止すると、データベースが更新されないことに気付きました。実際、実行する操作の数に関係なく、スレッドが完了するまで DB で何も更新されないようです。flush() が休止状態キャッシュ内のすべての更新をデータベースにプッシュしたと思いましたか? 私は何が欠けていますか?これは、 Hibernate フラッシュがデータベースを更新しないのと同じ問題だと思いますが、for ループは実行されていません。

4

2 に答える 2

8

フラッシュとは、Hibernate セッションが最終的に SQL ステートメントを順序付けてからデータベースに送信することを意味します。その後、データベースはそれらを (ロールバック セグメントで) 実行しますが、変更を永続化せず、他のユーザーが使用できるようにもしません。

コミットにより、最終的にデータベースは変更を永続的に保存できます。(例外は、データベースが自動コミット モードの場合です。これは、トランザクションの正確性が保証されず、すべてのデータベースで自動コミットが使用できないため、お勧めしません。また、フラッシュ モードがコミットに設定されている場合も同様です。柔軟性が失われます。)

commit は暗黙的に flush() を呼び出しますが、flush は commit() を呼び出しません。

解決策: プログラムの最後に追加のコミットを行います。

(ちなみに、多くの場合、すべてのトランザクションの後にフラッシュが行われますが、パフォーマンスを向上させるためだけに、多くのトランザクションの後にコミットが行われます。)

于 2012-10-02T11:44:48.373 に答える
2

トランザクションを明示的にコミットするとどうなりますか:

Transaction hTransaction = null;
try {
hTransaction = hSession.beginTransaction();

hSession.persist(o);


hTransaction.commit();
hSession.flush();

}
catch (Exception e)
{
    hTransaction.rollback();
    log.error(e.getMessage());
}

実際、セッションをフラッシュするときに知っているように、このセッションで開いたトランザクションはコミットする必要がありますが、これを確認してください。フラッシュしているセッションでトランザクションを作成していることを確認してください。

コミット時に自動的にフラッシュするようにチェックしたところ、モードは次のようになります。

hSession.setFlushMode(FlushMode.COMMIT)

ここからチェック

于 2012-10-02T11:01:32.443 に答える