エンティティのマッピング


オブジェクトとテーブルのマッピング


エンティティは、データベース内のテーブルにマッピングされたJavaオブジェクトです.したがって,Javaでテーブル内のデータを制御するためには,エンティティをうまくマッピングしなければならない.
エンティティをテーブルにマッピングする基本構文を見てみましょう.

@Entity


JPAを使用して、テーブルにマッピングするJavaオブジェクトをエンティティと呼びます.エンティティ宣言を使用してテーブルにマッピングされることをこのエンティティに通知する必要があります.
name attributeを使用してエンティティの名前を指定できます.省略できます.省略する場合は、クラスの名前をエンティティの名前として使用します.

@Table


エンティティにマッピングするデータベース・テーブルを指定する方法です.省略できます.省略すると、エンティティ名と同じテーブルが検索され、自動的にマッピングされます.
name attributeにマッピングするテーブル名を指定する必要があります.
@Entity
@Table(name = "MEMBER")
public class Member {

   @Id
   @Column(name = "id")
   private Long id;
   
   @Column(name = "name")
   private String name;

}

プライマリ・キーのマッピング


JPAでテーブルをクエリーする場合、通常はプライマリ・キー識別子を使用してクエリーを行います.したがって、データベースのプライマリ・キーをエンティティにマッピングする必要があります.

@Id


Id宣言をデフォルトキーとして使用するエンティティのフィールドに明記します.

プライマリ・キー生成ポリシー


データベースのプライマリ・キーはbigintタイプの整数として宣言され、通常auto increment制約があります.この場合、エンティティはどのようにしてプライマリ・キーを作成しますか?
  • ダイレクトアサイメント
  • IDENTITY
  • SEQUENCE
  • TABLE
  • エンティティは、上記の4つの方法でプライマリ・キーを生成します.

    ちょくせつわりあて


    直接割り当ては、auto increment制約を使用しないデータベースです.この場合、エンティティはプライマリ・キー作成ポリシーを指定する必要はありません.データを挿入するときに、プライマリ・キーを同時に割り当てる必要があります.

    IDENTITY


    この方法は、プライマリ・キー生成をデータベースに委任する方法です.エンティティでは、プライマリ・キーに単独で触れなくても、データベースにプライマリ・キーが作成されます.
    JPAでは、すべてのエンティティがプライマリ・キー識別子で区切られています.したがって、このようにデータを格納すると、javaでは識別子が分からないため、保存後、データベースと通信して識別子を取得する.つまり、書くのが遅くて役に立たないということです.
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    SEQUENCE


    Oracle、PostgreSQL、DB 2、H 2などのデータベースの作成に使用できるポリシーです.これらのデータベースはシーケンスをサポートし、シーケンスを使用してプライマリ・キーを生成します.
    まず、次のようにシーケンスを生成する必要があります.
    CREATE SEQUENCE TEST_SEQ START WITH 1 INCREMENT BY 1;
    次に、エンティティに@SequenceGeneratorを指定し、データベースで生成されたシーケンスを最初にマッピングし、そのGeneratorをプライマリ・キーに再マッピングします.
    @Entity
    @SequenceGenerator(name = "TEST_SEQ_GENERATOR", sequenceName = "TEST_SEQ",
    		   initialValue = 1, allocationSize = 1)
    public class Member(
    
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE,
        		    generator = "TEST_SEQ_GENERATOR")
        @Column(name = "id")
        private Long id;
    
    )

    TABLE


    この方法では、シーケンスがサポートされていないデータベースでテーブルをシーケンスとして使用します.まず、シーケンスとして使用するテーブルを次のように作成する必要があります.
    CREATE TABLE TEST_SEQUENCES(
        sequence_name varchar(255) not null,
        next_val bigint,
        primary key( sequence_name )
    )
    生成されたテーブルを@Table Generatorにマップし、このGeneratorをプライマリ・キーにマップします.
    @Entity
    @TableGenerator(name = "TEST_SEQ_GENERATOR", table = "TEST_SEQUENCES",
    		   pkColumnValue = "TEST_SEQ", allocationSize = 1)
    public class Member(
    
        @Id
        @GeneratedValue(strategy = GenerationType.TABLE,
        		    generator = "TEST_SEQ_GENERATOR")
        @Column(name = "id")
        private Long id;
    
    )
    TEST SEQUENCEテーブルでは、TEST SEQの値がsequence name(PK)と入力され、シーケンス値がnext valで1インクリメンタルでジェネレータが作成されマッピングされます.

    AUTO


    上記の基本鍵生成ポリシーがあるが、JPAはAUTOポリシーをベースとして提供している.これは、データベースの方言によって異なるポリシーが提供され、OracleではSEQUENCE、MySQLではIDENTITYが選択されます.
    @Id @GeneratedValue
    private Long id;
    通常、AUTO戦略は実務で上のように使用されます.データベースが変わっても、方言は自動的に戦略を選択するからです.

    フィールドとカラムのマッピング


    エンティティとテーブルをマッピングした後、エンティティのフィールドとテーブルの列をマッピングする必要があります.マッピングの説明を下表に示します.
    マッピング宣言@Column列からマッピング@Enumeration Javaへの列挙タイプマッピング@Temporal日付タイプマッピング@LobBLOB/CLOBタイプマッピング@Transent非マッピング@Accessメソッドの指定
    この表の内容を一つ一つ指摘しましょう.

    @Column


    これは柱をマッピングするツールです.DDLを使用しない場合、デフォルトで使用される属性はname属性のみです.マッピングするカラム名のプロパティを指定します.
    ただしnullableプロパティは例外です.nullableプロパティのデフォルトはtrueで、falseに設定するとnot null制約が追加されます.
    ただし、フィールドのタイプによってはnullableを指定する必要がある場合があります.intタイプのフィールドを使用する場合、javaのデフォルトタイプであるため、空の値は使用できません.したがって、@Column(name="id"、nullable=false)などのnot null制約を追加する必要があります.
    そうでなければ、最初はintタイプの代わりにIntegerタイプを使う方法もあります.

    @Enumerated


    Enumeration宣言はjavaのenumタイプをマッピングする宣言です.value属性があり、EnumTypeがあります.ORDINAL, EnumType.STRINGを選択して入力できます.
    前者はenumオブジェクトの順序でデータベースに格納され、後者はコンテンツでデータベースに格納されます.

    @Temporal


    一時的な宣言は、日付タイプをマッピングするために使用されます.DATE、TIME、TIMESTAMPの値を入力できるvalueプロパティがあります.
    DATEマッピング日、TIMEマッピング時間、TIMESTAMPマッピング日および時間.フィールドのタイプはDateタイプを使用できます.

    @Lob


    データベースのマッピングに使用されるBLOB、CLOBタイプ.
    CLOBは文字型データを格納するタイプであり、バイナリデータを格納するタイプはBLOBである.

    @Transient


    このフィールドをマップしないときに使用する構文.エンティティのフィールドを一時的に記憶領域として使用します.

    @Access


    JPAがエンティティにアクセスする方法を指定します.
    @Entity
    @Access(AccessType.FIELD) / @Access(AccessType.PROPERTY)
    上記の2つの方法で使用します.前者はフィールドに直接アクセスする方法であり、後者はgetterを使用してフィールドにアクセスする方法である.
    Id宣言はフィールドにフィールド形式で設定し、getterに属性形式で設定するので省略できます.
    また、フィールドにアクセス宣言を指定して、そのフィールドのみに対してアクセスメソッドを例外化することもできます.