JPAエンティティの定義

1. 前書き

このチュートリアルでは、JPAでエンティティを定義およびカスタマイズするさまざまな注釈とともに、エンティティの基本について学習します。

2. エンティティ

JPAのエンティティは、データベースに永続化できるデータを表すPOJOに他なりません。 エンティティは、データベースに格納されているテーブルを表します。 エンティティのすべてのインスタンスは、テーブル内の行を表します。

2.1. _Entity_アノテーション

学生のデータを表す_Student_というPOJOがあり、それをデータベースに保存するとします。
public class Student {

    // fields, getters and setters

}
これを行うには、JPAが認識できるようにエンティティを定義する必要があります。
_ @ Entity_アノテーションを使用して定義しましょう。 この注釈はクラスレベルで指定する必要があります。 *エンティティに引数なしのコンストラクタと主キーがあることも確認する必要があります:*
@Entity
public class Student {

    // fields, getters and setters

}
エンティティ名はデフォルトでクラスの名前になります。 _name_要素を使用して名前を変更できます。
@Entity(name="student")
public class Student {

    // fields, getters and setters

}
さまざまなJPA実装は、機能を提供するためにエンティティをサブクラス化しようとするため、*エンティティクラスは_final _。*として宣言しないでください。

2.2. _Id_アノテーション

各JPAエンティティには、一意に識別する主キーが必要です。 link:/hibernate-identifiers[[email protected]_アノテーション]は主キーを定義します。 _ @ GeneratedValue_アノテーションで指定されたさまざまな方法で識別子を生成できます。
_strategy_要素を使用して、4つのid生成戦略から選択できます。 *値は、_AUTO、TABLE、SEQUENCE、_、または_IDENTITY ._ *です。
@Entity
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    // getters and setters
}
_GenerationType _._ AUTO_を指定すると、JPAプロバイダーは識別子を生成するために必要な戦略を使用します。
エンティティのフィールドに注釈を付けると、JPAプロバイダーはこれらのフィールドを使用してエンティティの状態を取得および設定します。 フィールドアクセスに加えて、同じエンティティでフィールドアクセスとプロパティアクセスの両方を使用できるようにするプロパティアクセスまたは混合アクセスを行うこともできます**。**

2.3. _Table_アノテーション

ほとんどの場合、*データベース内のテーブルの名前とエンティティの名前は同じではありません。*
これらの場合、_ @ Table_アノテーションを使用してテーブル名を指定できます。
@Entity
@Table(name="STUDENT")
public class Student {

    // fields, getters and setters

}
_schema_要素を使用してスキーマに言及することもできます。
@Entity
@Table(name="STUDENT", schema="SCHOOL")
public class Student {

    // fields, getters and setters

}
スキーマ名は、あるテーブルセットを別のテーブルセットと区別するのに役立ちます。
_ @ Table_注釈を使用しない場合、エンティティの名前はテーブルの名前と見なされます。

2.4. _Column_アノテーション

_ @ Table_アノテーションと同様に、_ @ Column_アノテーションを使用して、テーブル内の列の詳細に言及できます。
_ @ Column_注釈には、_name、length、nullable、unique_などの多くの要素があります。
@Entity
@Table(name="STUDENT")
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
    private String name;

    // other fields, getters and setters
}
_name_要素は、テーブル内の列の名前を指定します。 _length_要素はその長さを指定します。 _nullable_要素は列がNULL可能かどうかを指定し、_unique_要素は列が一意かどうかを指定します。
この注釈を指定しない場合、フィールドの名前はテーブル内の列の名前と見なされます。

2.5. _Transient_アノテーション

時々、フィールドを非永続化したい場合があります。これを行うには、_ @ Transient_アノテーションを使用できます。 フィールドが永続化されないことを指定します。
たとえば、生年月日から生徒の年齢を計算できます。
それでは、フィールド_age_に_ @ Transient_アノテーションを付けましょう。
@Entity
@Table(name="STUDENT")
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(name="STUDENT_NAME", length=50, nullable=false)
    private String name;

    @Transient
    private Integer age;

    // other fields, getters and setters
}
その結果、フィールド_age_はテーブルに永続化されません。

2.6. _Temporal_アノテーション

場合によっては、一時的な値をテーブルに保存する必要があります。
このために、https://www.baeldung.com/hibernate-date-time [the _ @ Temporal_アノテーション]があります:
@Entity
@Table(name="STUDENT")
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
    private String name;

    @Transient
    private Integer age;

    @Temporal(TemporalType.DATE)
    private Date birthDate;

    // other fields, getters and setters
}
ただし、JPA 2.2では、_java.time.LocalDate、java.time.LocalTime、java.time.LocalDateTime、java.time.OffsetTime_および_java.time.OffsetDateTime._もサポートされています。

2.7. _Enumerated_アノテーション

時には、Java _enum_型を永続化したい場合があります。
_ @ Enumerated_アノテーションを使用して、_enum_を名前で保持するか、序数(デフォルト)で保持するかを指定できます。
public enum Gender {
    MALE,
    FEMALE
}
@Entity
@Table(name="STUDENT")
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
    private String name;

    @Transient
    private Integer age;

    @Temporal(TemporalType.DATE)
    private Date birthDate;

    @Enumerated(EnumType.STRING)
    private Gender gender;

    // other fields, getters and setters
}
実際、_enum_’sの序数で_Gender_を永続化する場合は、_ @ Enumerated_アノテーションを指定する必要はありません。*
ただし、_enum_名で_Gender_を保持するために、_EnumType.STRING._を使用して注釈を構成しました。

3. 結論

この記事では、JPAエンティティとは何か、そしてそれらを作成する方法を学びました。 また、エンティティをさらにカスタマイズするために使用できるさまざまな注釈についても学びました。
この記事の完全なコードは、https://github.com/eugenp/tutorials/tree/master/persistence-modules/java-jpa [Github上]にあります。