1. ORM とは何ですか?
オブジェクト リレーショナル マッピング (略して ORM) は、プログラムのオブジェクト指向モデルとデータベースのリレーショナル モデル間の不一致の問題を解決するテクノロジです。シンプル つまり、ORM は、オブジェクトとデータベース (Java では XML または注釈を使用できます) の間のマッピングを記述するメタデータを使用して、プログラム内のオブジェクトをリレーショナル データベースに自動的に永続化するか、リレーショナル データベース テーブル内の行を Java オブジェクトに変換します。 、基本的にデータをある形式から別の形式に変換します。
2. Hibernate の SessionFactory はスレッドセーフですか?セッションはスレッドセーフですか (2 つのスレッドが同じセッションを共有できますか)?
SessionFactory は Hibernate のデータ ストレージ概念に対応しており、スレッドセーフであり、複数のスレッドから同時にアクセスできます。通常、SessionFactory は起動時にのみ構築されます。アプリケーションの場合、簡単にアクセスできるように、シングルトン モードで SessionFactory をカプセル化するのが最善です。
(学習ビデオの推奨:
java ビデオ チュートリアル)セッションは、接続を表す軽量の非スレッドセーフ オブジェクト (セッションはスレッド間で共有できません) です。データベースと対話する作業単位。セッションは SessionFactory によって作成され、タスクが完了すると閉じられます。セッションは、永続化レイヤー サービスによって提供されるメイン インターフェイスです。
セッションにより、データベース接続の取得が遅れます (つまり、必要な場合にのみ接続が取得されます)。作成されるセッションが多すぎることを避けるために、ThreadLocal を使用してセッションを現在のスレッドにバインドし、同じスレッドが常に同じセッションを取得できるようにします。 Hibernate 3 の SessionFactory の getCurrentSession() メソッドでこれを行うことができます。
3. Session の save()、update()、merge()、lock()、saveOrUpdate()、およびpersist() メソッドは何をしますか?違いは何ですか?
Hibernate オブジェクトには、一時的、永続的、切り離されたという 3 つの状態があります。
一時的なインスタンスは、save()、persist()、または saveOrUpdate() メソッドを呼び出すことで永続化できます。
無料インスタンスは、update()、saveOrUpdate()、lock を呼び出すことで永続化できます。 () または replicate() は永続的になります。 save() とpersist() は SQL INSERT ステートメントをトリガーし、update() または merge() は UPDATE ステートメントをトリガーします。
save() と update() の違いは、一方は一時オブジェクトを永続状態に変換し、他方は自由オブジェクトを永続状態に変換することです。 merge() メソッドは、save() メソッドと update() メソッドの機能を完了できます。その目的は、新しい状態を既存の永続オブジェクトにマージするか、新しい永続オブジェクトを作成することです。
persist() メソッドについては、公式ドキュメントの指示に従ってください:
1.persist() メソッドは一時的なインスタンスを永続化しますが、識別子が入力されることは保証されません。永続インスタンスでは、識別子の入力はフラッシュ時間まで延期される場合があります;
2.persist() メソッドは、トランザクション外で呼び出されたときに INSERT ステートメントをトリガーしないことを保証します。必要な場合 長いセッションプロセスをカプセル化する場合、persist() メソッドが必要です;
(推奨チュートリアル:
java クイックスタート)3. save() メソッド 項目2 は保証されていません。識別子を返すため、トランザクションの内部または外部に関係なく、INSERT ステートメントがすぐに実行されます。 lock()メソッドとupdate()メソッドの違いは、update()メソッドはデタッチ状態のオブジェクトを永続状態に変更するのに対し、lock()メソッドはデタッチ状態のオブジェクトを変更することです。変化していない状態を永続的な状態にします。
4. セッションによるエンティティ オブジェクトの読み込みプロセスを説明します。1. データベース クエリ関数を呼び出す前に、セッションはまずエンティティ タイプと主キーを使用します。一次キャッシュ。検索、一次キャッシュ検索がヒットし、データ ステータスが正当な場合は、直接返されます。
2. 一次キャッシュがヒットしない場合、セッションは現在の NonExists に記録されます (クエリのブラックリストに相当し、無効なクエリが繰り返されると迅速に判断できるため、パフォーマンスが向上します)。NonExists に同じクエリ条件が存在する場合、null が返されます;
3。 1 次キャッシュのクエリが 2 次キャッシュのクエリに失敗した場合、2 次キャッシュがヒットした場合は、直接返されます;
4. 前のクエリがヒットしなかった場合、SQL ステートメントは次のようになります。クエリで対応するレコードが見つからない場合、クエリはセッションの NonExists に追加されて記録され、null を返します;
5. マッピング設定と SQL に従って ResultSet を取得しますステートメントを作成し、対応するエンティティ オブジェクトを作成します;
6. オブジェクトをセッションの管理 (レベル 1 キャッシュ) に組み込みます;
7. 対応するインターセプターがある場合は、onLoad メソッドを実行しますインターセプタの;
8. 2 次キャッシュが有効で、使用するように設定されている場合、データ オブジェクトは 2 次キャッシュに含まれます;
9. データを返します物体。
5. MyBatis でプレースホルダーを記述するために # と $ を使用することの違いは何ですか?# 受信データを文字列として扱い、受信データに引用符を自動的に追加します;
$ 受信データを SQL で直接表示および生成します。
注: $ プレースホルダーを使用すると、SQL インジェクション攻撃につながる可能性があります。# を使用できる場所には $ を使用しないでください。order by 句を記述するときは、# の代わりに $ を使用する必要があります。
関連チュートリアルの推奨事項: Java 面接の質問
以上がJava 永続層インタビューの質問 (1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。