[JPA]Java ORM標準プログラミング#4のクリーンアップ


この文章は金英漢の「java ORM標準プログラミング」教材に基づいて整理された。

JPAのコアコンセプト:エンティティとテーブルマッピング~について議論します.🤸

マッピング宣言


@Entity


JPAを使用して、テーブルにマッピングするクラスに使用します.
ツールバーの
  • name:JPAで使用するエンティティ名を指定します.設定されていない場合は、クラス名が使用されます.
  • 注意事項
  • デフォルトジェネレータは、必要な
  • です.
  • finalクラス、内部クラス、enum、インタフェースは使用できません
  • ストレージフィールドは最終的に
  • を無効にする.

    @Table


    エンティティにマッピングするテーブルを指定します.
    ツールバーの
  • name:マッピングするテーブル名(dafault:エンティティ名)
  • catalog:対応する機能を持つデータベースに
  • をマッピングする
  • schema:対応する機能を持つデータベースから
  • をマッピング

    モード自動作成設定


    JPAはクラスのマッピング情報によりデータベースごとに自動的にパターンを生成する機能をサポートしている.
    次の設定により、アプリケーションの実行時にデータベース・テーブルを自動的に作成できます.
    spring:
      jpa:
        hibernate:
          ddl-auto: create
    上の図に示すように、設定後の実行時にコンソールに出力されるモード生成ログ.既存のテーブルを削除して再生します.
    drop table if exists member;
    
    create table member (
        member_id bigint not null,
        city varchar(255),
        street varchar(255),
        zipcode varchar(255),
        username varchar(255),
        primary key (member_id)
    )

    hibernate.ddl-autoプロパティ

  • create:既存のテーブルを削除し、再作成します.DROP + CREATE
  • create-drop:createプロパティで、アプリケーションの終了時に作成したDDLを削除します.DROP + CREATE + DROP
  • update:テーブルとエンティティを比較して変更を変更します.
  • validate:テーブルとエンティティの間に差がある場合は、アプリケーションを実行せずに警告を残します.
  • none:自動生成機能X
    本番環境では、DDLのオプション(create、create-dop、updateなど)を変更すると、実際に使用しているテーブルやカラムを削除できますので、これらのオプションは使用しないでください。
  • を使用
    以上の設定は、環境に応じて適切な値を使用する必要があります.一般的に推奨されるシナリオポリシーは以下の通りです.
  • 開発初期:create,update
  • 初期化テストの開発者環境とCIサーバ:create,create-drop
  • テストサーバ:update,validate
  • ダンプ、操作:validate,none
  • 制約の追加


    エンティティに関連する制約が追加されている場合は、@Columnのプロパティを使用して設定できます.
    @Entity
    public class Member {
    
        @Id
        @Column(name="member_id")
        private Long id;
    
    	@Column(nullable = false, length = 20)
        private String username;
        ...
    }
    自動生成されたDDLのユーザー名にnot null制約条件と長さを指定できます.生成されたDDLは次のようになります.
    create table member (
           member_id bigint not null,
            city varchar(255),
            street varchar(255),
            zipcode varchar(255),
            username varchar(20) not null,
            primary key (member_id)
        )
    @TableのuniqueConstraintsプロパティで特別な制約を付与することもできます.
    @Entity
    @Table(uniqueConstraints = {
            @UniqueConstraint(
                    name = "ID_NAME_UNIQUE",
                    columnNames = {"MEMBER_ID", "USERNAME"}
            )
    })
    public class Member {
    
        @Id
        @Column(name="member_id")
        private Long id;
    
    	@Column(nullable = false, length = 20)
        private String username;
        ...
    }
    生成されたDDLは次のようになります.
    alter table member 
           add constraint ID_NAME_UNIQUE unique (member_id, username)
    上記の機能はDDL生成時のみ使用され、JPAの実行ロジックには影響しません.したがって、モード自動生成機能を使用しなければ、上記の設定は不要となる.

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


    データベースごとにプライマリ・キーを生成する方法が異なり、JPAはプライマリ・キー・マッピング機能を提供します.
  • 直接割当て:アプリケーションはプライマリ・キーを直接割当てます.識別子値がない場合、例外が発生します.
      @Entity
      public class Member {
          @Id
          private Long id;
  • IDENTITY:プライマリ・キー生成をデータベースに委任します.エンティティを保存した後、エンティティで割り当てられた識別子値を検索して保存します.
      @Entity
      public class Member {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
  • SEQUENCE:プライマリ・キーをデータベース・シーケンスで割り当てます.エンティティ・ストレージ・シーケンスを使用して、まず識別子をクエリーし、データベースに保存します.
      @Entity
      public class Member {
          @Id
          @GeneratedValue(strategy = GenerationType.SEQUENCE,
                                    generator = "MEMBER_SEQ_GENERATOR")
          private Long id;
  • TABLE:鍵を生成するテーブルを作成し、シーケンスとして使用します.内部動作方式はSEQUENCEポリシーと同じである.
      @Entity
      public class Member {
          @Id
          @GeneratedValue(strategy = GenerationType.TABLE,
                                    generator = "MEMBER_SEQ_GENERATOR")
          private Long id;
  • AUTO:データベースに基づいて適切なポリシー(Default/Oracle:SEQUENCE,MySQL:IDENTITY)
  • を選択

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


    @Enumerated


    Javaをマッピングするためのenumタイプ.
    各メンバにアドレス情報があると仮定すると,アドレス情報はJPA enum言語で以下のように表現できる.
    @Entity
    public class Member {
    	@Id
        @GeneratedValue
        @Column(name="member_id")
        private Long id;
    
        private String username;
        
        @Embedded
        private Address address;
    }
    
    @Embeddable
    public class Address {
        private String city;
        private String street;
        private String zipcode;
    }
    お読みいただきありがとうございます~:)