JPAアノテーションによるエンティティマッピング
@Entity、@Table、@Id、@GeneratedValue、@Column、@Embeddedを定義し、整理されたエンティティを設計します。
「JPAアノテーションによるエンティティマッピング」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
JPAエンティティマッピングとは
JPA(Jakarta Persistence API)は、アノテーションを使用してJavaクラスをデータベーステーブルにマッピングします。Hibernateは最も一般的なJPAプロバイダーです。SQL DDLを記述する必要はなく、JPAがアノテーションからスキーマを生成します。
@Entityと@Table
@Entityは、クラスをJPAエンティティとしてマークします。@Tableでは、テーブル名、スキーマ、一意制約をカスタマイズできます。すべてのエンティティには、引数なしのコンストラクターが必要です(protectedでも構いません)。
@Entity
@Table(name = "users", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User {
// ...
protected User() {} // required by JPA
}@Idと@GeneratedValue
@Idは主キーのフィールドを示します。@GeneratedValueでは、自動生成戦略を設定します。IDENTITY(DBの自動インクリメント)、SEQUENCE(DBシーケンス。バルク挿入に適しています)、またはAUTOを指定できます。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}@Column: カラムのカスタマイズ
@Columnでは、カラム名、長さ、null許容性、一意性を設定します。指定しない場合は、フィールド名がカラム名になります。
@Column(name = "full_name", nullable = false, length = 100)
private String name;
@Column(name = "email", unique = true, nullable = false)
private String email;
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;@Embeddedと@Embeddable
複数のカラムのグループを、@Embeddableを付けた再利用可能な値オブジェクトとして切り出します。エンティティで@Embeddedを使用すると、そのフィールドを取り込めます。
@Embeddable
public class Address {
private String street, city, country;
@Column(name = "zip_code") private String zipCode;
}
@Entity
public class User {
@Embedded private Address address;
}@Enumerated: enumの永続化
enumは名前の文字列(STRING)または序数の整数(ORDINAL)として永続化できます。常にSTRINGを使用してください。enum値の順序を変更すると、序数は壊れるためです。
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private UserStatus status; // stored as "ACTIVE", "INACTIVE", etc.@CreationTimestampと@UpdateTimestamp
これらはHibernate固有のアノテーションで、挿入時と更新時にそれぞれタイムスタンプを自動設定します。手動で@PrePersistを使用する必要はありません。
@CreationTimestamp
@Column(updatable = false)
private LocalDateTime createdAt;
@UpdateTimestamp
private LocalDateTime updatedAt;@Transient: フィールドの除外
@Transientを付けたフィールドは永続化されません。データベースに保存しない派生フィールドや計算フィールドに使用します。
@Transient
public String getFullName() { return firstName + " " + lastName; }@Lob: ラージオブジェクト
@Lobを使用すると、大きなテキスト(TEXT/CLOB)またはバイナリ(BLOB)のカラムにマッピングできます。PostgreSQLでは、@Lob StringはTEXTにマッピングされます。
@Lob
@Column(name = "content")
private String content; // maps to TEXT in PostgreSQLequalsとhashCodeの契約
コレクション内で使用するJPAエンティティは、生成されたIDではなくビジネスキーに基づいてequals / hashCodeを実装する必要があります。生成されたIDは永続化前にはnullだからです。@NaturalIdまたはUUIDのサロゲートキーを使用してください。
@Override public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User u)) return false;
return email != null && email.equals(u.email);
}
@Override public int hashCode() { return getClass().hashCode(); }@Versionによる楽観的ロック
@Versionフィールドを追加します。Hibernateは更新のたびにその値をインクリメントします。2つのトランザクションが同じ行を同時に更新すると、2番目のトランザクションはOptimisticLockExceptionをスローします。
@Version
private Long version; // auto-managed by Hibernateクイックチェック
@Enumeratedでは、なぜORDINALではなくSTRINGを使用すべきですか?
まとめ
クラスとテーブルのマッピングには@Entity/@Tableを使用します。主キーには@Id+@GeneratedValueを使用します。制約には@Columnを使用します。値オブジェクトには@Embeddedを使用します。常に@Enumerated(STRING)を使用してください。楽観的ロックには@Versionを追加します。
よくある質問
「JPAアノテーションによるエンティティマッピング」レッスンは無料ですか?
はい。「JPAアノテーションによるエンティティマッピング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「JPAアノテーションによるエンティティマッピング」で何を学びますか?
@Entity、@Table、@Id、@GeneratedValue、@Column、@Embeddedを定義し、整理されたエンティティを設計します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「JPAアノテーションによるエンティティマッピング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JPAアノテーションによるエンティティマッピング
- Spring Dataリポジトリとクエリメソッド
- 1対多と多対多のリレーションシップ
- ページネーション、ソート、プロジェクション