0Pricing
Java Academy · レッスン

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 PostgreSQL

equalsと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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JPAアノテーションによるエンティティマッピング
  2. Spring Dataリポジトリとクエリメソッド
  3. 1対多と多対多のリレーションシップ
  4. ページネーション、ソート、プロジェクション
← Java Academyに戻る