0

1 回の呼び出しの場合、顧客への挿入session.save(customerObject)はありません...データベースへのクエリ。Hibernate は id プロパティ (「sequence」または「Increment」ジェネレーター) を設定し、エンティティを永続化コンテキストにバインドします。transaction.commit()が呼び出されると、永続化コンテキストがデータベースと同期されます
Q: Hibernate は id プロパティをどこに設定しますか?
Q: パーシスタンス コンテキストは、db と同期する前に、顧客への SQL クエリの挿入をキャッシュしますか? つまり、いつSQLが生成されますか(saveまたはsession.flush/tx.commitの実行中)

編集: https://forum.hibernate.org/viewtopic.php?t=951275&highlight=difference%20persist%20saveから以下を取得しました

persist() は明確に定義されています。一時的なインスタンスを永続化します。ただし、識別子の値が永続インスタンスにすぐに割り当てられるとは限りません。割り当てはフラッシュ時に発生する可能性があります。仕様にはそれが記載されていません。これは、persist() で私が抱えている問題です。

persist() は、トランザクション境界の外で呼び出された場合、INSERT ステートメントを実行しないことも保証します。これは、拡張されたセッション/永続コンテキストを使用した長時間の会話で役立ちます。

persist() のようなメソッドが必要です。

save() は同じことを保証しません。識別子を返します。識別子を取得するために INSERT を実行する必要がある場合 (たとえば、「シーケンス」ではなく「アイデンティティ」ジェネレータ)、この INSERT はすぐに実行されます。またはトランザクション外。これは、拡張されたセッション/永続コンテキストを使用した長時間の会話には適していません。

これはもっと紛らわしい

4

1 に答える 1

0

一般に、Hibernate は、プログラムの正確性を損なうことなく、提供するメソッドの契約を尊重することによって、データベースにできるだけ最新の書き込みを試みます。

save()保存されたエンティティに ID を割り当ててこの ID を返すように文書化されているため、 が呼び出されたときに ID を生成し、それをsave()返します。これは、ID 生成戦略に応じて、エンティティが DB に書き込まれるかどうかを意味する場合があります。

persist()は、呼び出されたときに識別子が割り当てられることを保証しないため、呼び出された後に割り当てられる ID を期待することはできませんpersist()。また、エンティティが DB に書き込まれることも期待できません。それはそうではないからですpersist()。それはそれと同じくらい簡単です。

flush()DB への書き込みは、セッションがフラッシュされたとき、コミット前に自動的に、または明示的に呼び出されたときにのみ実行されることが保証されます。結果が保留中の書き込みに依存する可能性があるクエリを実行する場合、DB への書き込みが実行されるという保証もあります。

于 2013-03-11T21:34:28.710 に答える