Spring Data JPA
hibernate-core
One to One
Join Table(関連 テーブル)と組 み合 わせ: 二 つのエンティティがそれぞれ独立 した主 キーを持 つ場合 に使用 。 柔軟性 が高 い利点 がありますが、追加 の関連 テーブルの維持 が必要 。
Foreign Key(外部 キー)と組 み合 わせ: 最 も一般的 な方法 。一 つのエンティティの主 キーが別 のエンティティへの外部 キーとしても機能 。 追加 の関連 テーブルを回避 し、強 い結合 を確立 。
Shared Primary Key(共有 主 キー): 二 つのエンティティが完全 に同 じ主 キー値 を共有 。 最 も強 い一対一 マッピング方式 ですが、柔軟性 は低 い。
- 関連 テーブル方式 は柔軟性 が高 いですが、パフォーマンスはやや劣 ります。
- ほとんどの場合 、外部 キー方式 (Foreign Key) がデフォルトの最良 の選択 です。
- 主 キーが完全 に同 じである必要 がある場合 のみ共有 主 キーを検討 。
共有 主 キーの例 (Shared Primary Key)
- 両方
に
@OneToOneを付与 し、一方 に@MapsIdを使用 。 - エンティティクラスの例
:
- products (親 )
- products_details (子 、親 の主 キーを共有 )
外部 キー方式 の例 (One to One with Foreign Key)
Lazy & Eager Load
- Lazy (遅延 ロード): 関連 プロパティに実際 にアクセスしたときにのみ SQL クエリを発行 。
- Eager (即時 ロード): 主体 のクエリ時 に Join で関連 データも取得 。
Many to Many
erDiagram
student ||--|{ students_courses : has
course ||--|{ students_courses : has
JPA Entity Life Cycle
- New / Transient: 新 しく作成 されたオブジェクト、まだ主 キー ID を持 たず、Persistence Context に管理 されていない。
- Managed: 永続化 され、コンテナに管理 されている。オブジェクトへの変更 はトランザクションコミット時 にデータベースに同期 。
- Detached: オブジェクトは ID を持 つが、コンテナ管理 から離 れている(トランザクション終了 や手動 detach など)。
- Removed: 削除 としてマークされ、トランザクションコミット時 にデータベースから削除 。
flowchart TB nt[New/Transient] d[Detached] m[Managed] r[Removed] db((database)) nt -->|persist, save| m m -->|detach, evict, clear, close| d m -->|remove| r m -->|flush| db d -->|merge| m r -->|persist| m r -->|flush| db
JPA vs Spring Data JPA vs Hibernate
flowchart LR SDJPA[Spring Data JPA] JPA[JPA] subgraph Hibernate JDBC[JDBC] end DB[Database] SDJPA <--> JPA <--> Hibernate <--> DB
| 項目 | 説明 |
|---|---|
| JPA | 仕様 (標準 )。ORM 標準 を定義 。 |
| Hibernate | 実装 。JPA の最 も一般的 なプロバイダ。 |
| Spring Data JPA | 抽象化 レイヤー。DAO ボイラープレートコードを削減 。 |