| この記事の要点 |
|---|
|
基本的な使い方
@Entity
@Table(name = "users")
public class User {
@Id @GeneratedValue
private Long id;
private String name;
}
// → "users" テーブルにマッピング
// 省略するとクラス名から推測
@Entity
public class UserProfile { } // → "user_profile" テーブル
属性一覧
| 属性 | 用途 | 例 |
|---|---|---|
name | テーブル名 | "users" |
schema | スキーマ名 | "auth" |
catalog | カタログ名 | "company_db" |
indexes | インデックス定義 | @Index 配列 |
uniqueConstraints | UNIQUE 制約 | @UniqueConstraint 配列 |
スキーマの指定
// PostgreSQL / Oracle のスキーマ
@Entity
@Table(name = "users", schema = "auth")
public class User { }
// → SELECT * FROM auth.users
// 複数スキーマ運用
@Entity
@Table(name = "users", schema = "tenant_a")
public class TenantAUser { }
@Entity
@Table(name = "users", schema = "tenant_b")
public class TenantBUser { }
インデックスの定義
@Entity
@Table(name = "users",
indexes = {
@Index(name = "idx_users_email", columnList = "email", unique = true),
@Index(name = "idx_users_status", columnList = "status"),
@Index(name = "idx_users_created", columnList = "created_at"),
@Index(name = "idx_users_status_role", columnList = "status, role"), // 複合
}
)
public class User { }
// 生成される DDL
// CREATE UNIQUE INDEX idx_users_email ON users(email);
// CREATE INDEX idx_users_status ON users(status);
// CREATE INDEX idx_users_created ON users(created_at);
// CREATE INDEX idx_users_status_role ON users(status, role);
UNIQUE 制約の定義
@Entity
@Table(name = "users",
uniqueConstraints = {
@UniqueConstraint(name = "uk_users_email", columnNames = "email"),
@UniqueConstraint(name = "uk_users_tenant_username",
columnNames = {"tenant_id", "username"}) // 複合 UNIQUE
}
)
public class User { }
// 生成される DDL
// ALTER TABLE users ADD CONSTRAINT uk_users_email UNIQUE (email);
// ALTER TABLE users ADD CONSTRAINT uk_users_tenant_username UNIQUE (tenant_id, username);
命名規則のカスタマイズ
Spring Boot のデフォルトはキャメルケース → スネークケース変換。これを無効化したい場合:
# application.properties
# デフォルト: SpringPhysicalNamingStrategy (キャメル → スネーク)
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
# クラス名そのまま使いたい場合
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
# → UserProfile クラス → UserProfile テーブル (スネーク変換なし)
# 完全カスタム
spring.jpa.hibernate.naming.physical-strategy=com.example.MyCustomNamingStrategy
複数 DB / @SecondaryTable(1 エンティティ複数テーブル)
// メインテーブル + 補助テーブル
@Entity
@Table(name = "users")
@SecondaryTable(name = "user_profiles", pkJoinColumns = @PrimaryKeyJoinColumn(name = "user_id"))
public class User {
@Id @GeneratedValue
private Long id;
private String name; // users.name
@Column(table = "user_profiles", name = "bio")
private String bio; // user_profiles.bio
@Column(table = "user_profiles", name = "birth_date")
private LocalDate birthDate; // user_profiles.birth_date
}
// 1 エンティティで 2 テーブル管理 (推奨されない、関連で分けた方が良い)
動的テーブル名(Multi-Tenant)
テナント別にテーブル名を変えたい場合は @Table ではなく Hibernate の MultiTenancy 機能を使用:
// application.properties
spring.jpa.properties.hibernate.multiTenancy=SCHEMA
spring.jpa.properties.hibernate.tenant_identifier_resolver=com.example.MyTenantResolver
spring.jpa.properties.hibernate.multi_tenant_connection_provider=com.example.MyConnectionProvider
// テナント解決
@Component
public class MyTenantResolver implements CurrentTenantIdentifierResolver<String> {
@Override
public String resolveCurrentTenantIdentifier() {
return TenantContext.getCurrentTenant(); // ThreadLocal 等から取得
}
}
テーブル名衝突の回避
// 異なるパッケージで同名エンティティ
@Entity
@Table(name = "blog_posts") // ← 明示しないと "post" 同士で衝突
package com.example.blog;
public class Post { }
@Entity
@Table(name = "news_posts")
package com.example.news;
public class Post { }
// SQL 上は別テーブルになり、JPQL は class で区別される
命名のベストプラクティス
- スネークケース統一:
user_profiles◯、userProfiles× - 複数形: テーブルは
users複数、エンティティはUser単数 - プレフィックスは避ける:
tbl_users×、users◯ - 明示的命名:
@Table(name = "...")を必ず付ける(クラスリネーム時の安全性) - インデックスは命名規則を統一:
idx_テーブル_カラム等 - UNIQUE は uk_ プレフィックス
注意点
- DDL は Hibernate 自動生成:
spring.jpa.hibernate.ddl-auto= update/create で生成 - 本番は Flyway / Liquibase: Hibernate 自動 DDL は本番非推奨
- schema 指定で接続先 DB の権限: SELECT 等の権限がないとエラー
- カラムは @Column で別途指定: @Table はあくまでテーブルレベル
関連記事
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09