0

Hibernateではトランザクションがコミットされない場合、変更はデータベースに影響を与えないことは誰もが知っています。しかし、私は何か奇妙なものを見つけました。そして次のようなコード:

ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring.xml");
    SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory");
    Session session = sessionFactory.openSession();
    Model model = new Model();
    ...
    session.save(model);
    session.flush();
    session.close();

そして、トランザクションがなくてもモデルはデータベースに保存されました、誰でもこれを説明できますか?コメントをいただければ幸いです。ありがとう!

PS:私はmysqlを使用しています。

4

3 に答える 3

1

通常、休止状態は機能するためにラインsession.beginTransaction();を必要とします。あなたはそれを書いておらず、あなたのアプリケーションは機能していました。あなたのアプリケーションは、トランザクション管理を提供するアプリケーションサーバーで実行されていると思います。例: jboss、weblogic...

ただし、取引がないわけではありません。自動コミットをtrueに設定しましたか?

ところで、 session.flush() と txn.commit() は異なります。

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

session.flush() の後でも、txn.rollback() を呼び出してすべての変更をロールバックできます。

編集

ああ、あなたが春を使っているのを見ました。春にtxnmanagerを設定しましたか?

于 2013-01-23T09:49:30.363 に答える
1

session.flush コマンドがトランザクションを保存しました。間違っている場合は、トランザクションを使用する必要があります。

于 2013-01-23T09:02:29.700 に答える
0

Hibernate はトランザクションを必要としません。データベース ベースのアプリケーションで最も一般的な問題は、トランザクションを使用すると簡単に解決できるため、通常は誰もが Hibernate でトランザクションを使用します。しかし、それは単なる偶然/慣習/怠惰です。

Hibernate が必要とするのはjava.sql.Connection、現在のトランザクション マネージャーが構成されていなくてもコンテナーがそれを提供している場合、Hibernate はそれで問題ありません。

実際、Hibernate はトランザクション マネージャが存在する可能性があることを認識していません。session.flush()を使用して接続を取得し、SQL を生成し、 JDBCApplicationContextを使用して生成された SQL コードをデータベースに送信します。

Hibernate の観点からは、それがすべてです。

データがデータベースにコミットされる理由はいくつか考えられます。

  1. 接続の自動コミットをオフにするのを忘れました。
  2. Web コンテナー/Spring 構成は、HTTP 要求と同期するトランザクション マネージャーを自動的に接続します。
  3. あなたのコードは、注釈が付けられた別のメソッドから呼び出され@Transactionalます; この場合、既存のトランザクションを継承します。
于 2013-01-23T10:52:19.800 に答える