1. 序章

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

2. 実在物

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

2.1. エンティティアノテーション

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エンティティには、それを一意に識別する主キーが必要です。 @Idアノテーションは主キーを定義します。 @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
}

GenerationTypeAUTOを指定すると、JPAプロバイダーは識別子を生成するための任意の戦略を使用します。

エンティティのフィールドに注釈を付ける場合、JPAプロバイダーはこれらのフィールドを使用してエンティティの状態を取得および設定します。 フィールドアクセスに加えて、プロパティアクセスまたは混合アクセスも実行できます。これにより、同じエンティティでフィールドアクセスとプロパティアクセスの両方を使用できます

2.3. テーブルアノテーション

ほとんどの場合、 データベース内のテーブルの名前とエンティティの名前は同じではありません。

このような場合、@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. 注釈

@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アノテーション

時々、私たちはしたいかもしれませんフィールドを非永続化します。 使用できます @トランジェントそうするための注釈。 フィールドが永続化されないことを指定します。

たとえば、生年月日から学生の年齢を計算できます。

それでは、フィールド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アノテーション

場合によっては、一時的な値をテーブルに保存する必要があります。

このために、@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. 列挙型アノテーション

Java列挙型タイプを永続化したい場合があります。

@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
}

実際、 列挙型の序数で性別を永続化する場合は、@Enumeratedアノテーションを指定する必要はまったくありません。

ただし、Genderenum nameで永続化するために、EnumType.STRING。を使用してアノテーションを構成しました。

3. 結論

この記事では、JPAエンティティとは何かとその作成方法を学びました。 また、エンティティをさらにカスタマイズするために使用できるさまざまな注釈についても学びました。

この記事の完全なコードは、Githubにあります。