| メソッド | 説明 | 戻り | トランザクションが必要です |
| save() | すぐに挿入します。生成された識別子を返します | シリアル化可能 | オプション |
| persist() | エンティティを登録します。フラッシュするまで識別子なし | 無効 | 必須 |
| saveOrUpdate() | 新規の場合は挿入、既存の場合は更新 | 無効 | 必須 |
テーブル>
persist() を優先します 純粋な JPA コンテキストの場合。 saveOrUpdate() を使用してください Hibernate バージョン間で作業する場合。
25) Hibernate は複合主キーをどのように処理しますか?
複合キーは @Embeddable で表されます。 および @EmbeddedId 注釈。
@Embeddable
public class EmployeeId implements Serializable {
private int empId;
private String departmentId;
}
@Entity
public class Employee {
@EmbeddedId
private EmployeeId id;
}
従来のスキーマまたは自然なキーの組み合わせに役立ちます。
26) Hibernate における N+1 選択の問題とは何ですか?また、それを回避するにはどうすればよいですか?
N+1 問題は、クエリが親エンティティを取得し、各子に対して N 個の追加クエリをトリガーする場合に発生します。
- 解決策 1:
JOIN FETCH HQL で。
- 解決策 2:バッチ取得 (
hibernate.default_batch_fetch_size を設定) ).
- 解決策 3:反復クエリ用の 2 次キャッシュ。
例:SELECT d FROM Department d JOIN FETCH d.employees;
27) hibernate.cfg.xml の役割は何ですか? ファイル?
この XML ファイルは、JDBC 設定、ダイアレクト、マッピング、キャッシュ、トランザクション オプションなどの構成を一元管理します。
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping class="com.example.Employee"/>
</session-factory>
</hibernate-configuration>
最近のプロジェクトでは、多くの場合、注釈やプログラムによる構成で置き換えたり補足したりします。
28) Hibernate でページネーションを実装するにはどうすればよいですか?
ページネーションにより結果セットが制限され、メモリ消費量が削減されます。
Query query = session.createQuery("from Employee");
query.setFirstResult(10); // skip first 10
query.setMaxResults(20); // fetch next 20
List<Employee> list = query.list();
REST API と大規模なデータ テーブルに効果的です。
29) Hibernate は同時実行性とバージョン管理をどのように管理しますか?
Hibernate は楽観的ロックを採用しています。 @Version を使用 注釈。更新ごとにバージョン列が増加し、更新が競合すると OptimisticLockException が発生します。 .
@Version
@Column(name="version")
private int version;
競合が多いシナリオの場合、悲観的ロック LockMode.PESSIMISTIC_WRITE で適用できます .
30) 一般的な Hibernate 面接ケースのシナリオにはどのようなものがありますか?また、それらをどのように処理しますか?
- セッション終了後の LazyInitializationException – ビューでオープン セッションを使用するか、熱心なフェッチを使用します。
- 分離されたエンティティの重複挿入 –
merge() を優先します update() を超える .
- 過剰なクエリによりパフォーマンスが低下する – キャッシュ、バッチフェッチ、または HQL 結合の書き換えを有効にする。
- 同時更新の競合 –
@Version を使用して楽観的ロックを実装します。 または、悲観的なロックに切り替えます。
これらのシナリオは、上級開発者やアーキテクトにとって重要なスキルである実践的な問題解決を示しています。
🔍 現実世界のシナリオと戦略的な回答を含む Hibernate 面接のよくある質問
以下に、知識、行動、状況の側面をカバーする 10 の現実的な質問を示します。それぞれの質問には、面接官の期待と簡潔な回答例が含まれています。
1) Hibernate とは何ですか?なぜエンタープライズ アプリケーションで Hibernate が使用されるのですか?
期待: 目的、利点、一般的な使用例の明確な説明。
回答例: Hibernate は SQL を抽象化する ORM で、開発者が永続性、キャッシュ、トランザクション管理を処理しながら Java オブジェクトを操作できるようにします。これにより定型文が削減され、移植性が向上し、大規模システムのパフォーマンスが向上します。
2) get() の違いを説明できますか? および load() 休止状態ですか?
期待: 取得の仕組みとプロキシの動作についての理解。
回答例: get() すぐにデータベースにクエリを実行し、null を返します。 レコードが存在しない場合。 load() プロキシを返し、エンティティがアクセスされるまでクエリを延期し、ObjectNotFoundException をスローします。 見つからない場合。
3) Hibernate で遭遇した困難な状況と、それをどのように解決したかについて説明してください。
期待: トラブルシューティング、デバッグ、最適化のスキルを実証します。
回答例: コレクションのフェッチを JOIN FETCH に置き換えることで、N+1 選択のボトルネックを解決しました。 そしてバッチフェッチの設定。これにより、クエリ数が 101 から 3 に削減され、応答時間が 70% 改善されました。
4) Hibernate で遅延読み込み例外をどのように処理しますか?
期待: セッションのライフサイクルと緩和戦略を認識する。
回答例: ビューのレンダリング中に開いたセッションを維持するか、ビューでオープン セッションを使用します。重要な関連付けの場合は、遅延初期化エラーを回避するために、即時フェッチに切り替えるか、DTO プロジェクションを使用します。
5) Hibernate はどのようなキャッシュ戦略をサポートしていますか?
期待: 第 1 レベル、第 2 レベル、およびクエリ キャッシュに関する知識。
回答例: Hibernate は、セッションごとに必須の第 1 レベルのキャッシュと、オプションの第 2 レベルのキャッシュ (Ehcache、Infinispan) を提供します。クエリ キャッシュは、第 2 レベルのキャッシュと連携して動作し、繰り返されるクエリの結果セットを保存します。
6) 永続層の問題を解決するためにチームと協力したときのことを教えてください。
期待: コミュニケーションとチームワークを実証します。
回答例: バックエンド チームと DBA チームと協力して、Hibernate ログを介して遅いクエリを特定し、HQL をリファクタリングし、頻繁にクエリされる列にインデックスを追加して、レイテンシを 55% 削減しました。
7) 複数の関係を持つ複雑なドメイン モデルの Hibernate マッピングをどのように設計しますか?
期待: カーディナリティ、所有権、カスケード、フェッチをマッピングする機能。
回答例: ドメインを分析して 1 対多、多対多、1 対 1 の関係を特定し、@OneToMany で注釈を付けます。 または @ManyToMany 、ビジネス要件に基づいてカスケード モードとフェッチ モードを設定します。
8) Hibernate が運用環境で非効率な SQL を生成した場合、どのような手順を実行しますか?
期待: パフォーマンスのトラブルシューティングの考え方。
回答例: SQL ログの有効化、生成されたクエリの確認、フェッチ タイプの調整、HQL のリファクタリング、またはクエリ ヒントの導入を行います。重大な場合には、特定の操作にネイティブ SQL を使用します。
9) トランザクション Hibernate アプリケーションでデータの整合性と一貫性を確保するにはどうすればよいですか?
期待: トランザクション管理と同時実行制御に関する知識。
回答例: 宣言的な @Transactional を使用します。 境界、@Version による楽観的ロック 分散トランザクション間で一貫性を維持するための適切な伝播設定。
10) Hibernate が重要な役割を果たしたプロジェクトと、その成功をどのように確保したかについて説明してください。
期待: 現実世界への影響とオーナーシップ。
回答例: 大規模な注文処理システムで、効率的なエンティティ マッピングを設計し、キャッシュを実装し、再利用可能な DAO レイヤーを作成しました。これにより、データベースの負荷が 40% 削減され、導入サイクルがよりスムーズになりました。