ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|---|
|
基本的な使い方
@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 {
@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=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?