10

transaction.commit()は何をしますか?

Account account = new Account();
account.setId(100);
account = (Account) session.get(Account.class, account.getId());
System.out.println("Before Transaction: Balance = " + account.getBalance());
double preBal = account.getBalance();
account.setBalance(50000000);
Transaction transaction = session.beginTransaction();
session.update(account);
account = (Account) session.get(Account.class, account.getId());
System.out.println("After Transaction: Balance = " + account.getBalance());
// transaction.commit();    
account = (Account) session.get(Account.class, account.getId());
System.out.println("Pev-Bal=" + preBal + " Curr-Bal=" + account.getBalance());

これは私に結果を与えます:

Hibernate: select account0_.id as id0_1_, account0_.balance as ..........
Before Transaction: Balance = 300.0
After Transaction: Balance = 5.0E7
Pev-Bal=300.0 Curr-Bal=5.0E7

しかし、transaction.commit()を呼び出さなかったので、データベースに変更はありませんでした。

これは、データベースを実際に変更せずに、一部のインスタンス/オブジェクトに対してのみすべてが行われたことを意味しますか?

私はHibernateが初めてなので、理解してください。ハイバネート4を使用しています。

アップデート:

transaction.commit()を呼び出すと、結果は次の行になります

Hibernate: update account set balance=? where id=?

また、データベースも更新されました。

これは、 transaction.commit()を呼び出すことなく、データベースを実際に変更することなく、すべてがインスタンス レベルでのみ行われたということですか?

4

2 に答える 2

16

Commitはデータベースをコミットします。永続オブジェクトへの変更はデータベースに書き込まれます。 フラッシュは、基になる永続ストアをメモリに保持されている永続状態と同期させるプロセスです。すなわち。実行中のトランザクションでテーブルを更新または挿入しますが、それらの変更をコミットしない場合があります (これはフラッシュ モードによって異なります)。

永続化されたオブジェクトがあり、その値を変更すると、それはダーティになり、休止状態はこれらの変更を永続化レイヤーにフラッシュする必要があります。これは自動的に行われる場合と、フラッシュモード(自動または手動)に応じて手動で行う必要がある場合があります:)

つまり、transaction.commit()はセッションをフラッシュしますが、作業単位も終了します。

ここにあなたの問題への同様の参照があります

于 2013-01-31T13:06:53.787 に答える