JPAの@GeneratedValue注記

3458 ワード

JPAの@GeneratedValue注記、@GeneratedValue注記は、主に1つのエンティティに対して一意に識別されたプライマリ・キーを生成することを意味します(JPAではエンティティごとにEntityが必要で、プライマリ・キーが1つしかない必要があります).@GeneratedValueは、プライマリ・キーの生成ポリシーを提供します.@GeneratedValue注記には、strategyとgeneratorの2つのプロパティがあります.generatorプロパティの値は文字列で、デフォルトは「」で、プライマリ・キー・ジェネレータの名前(同名のプライマリ・キー・ジェネレータ@SequenceGeneratorおよび@Table Generatorに対応)が宣言されます.
JPAは開発者に4種類の主キー生成戦略を提供し、それは列挙類GenerationTypeに定義され、GenerationTypeを含む.TABLE,GenerationType.SEQUENCE,GenerationType.IDENTITYとGenerationType.AUTO.以下では、この4つのプライマリ・キー生成ポリシーについて説明します.
1.GenerationType.TABLE
特定のデータベーステーブルを使用してプライマリ・キーを保存し、永続化エンジンはリレーショナル・データベースの特定のテーブルを使用してプライマリ・キーを生成します.このポリシーの利点は、外部環境やデータベースの具体的な実装に依存せず、異なるデータベース間で容易に移行できますが、データベースの特性を十分に利用できないため、優先的に使用しません.このポリシーは一般に、@Table Generatorを別の注釈とともに使用し、@Table Generator注釈はプライマリ・キーを生成するテーブルを指定し(エンティティ・クラスで指定してもよいし、プライマリ・キー・フィールドまたは属性で指定してもよい)、JPAは注釈の内容に基づいてシーケンス・リストとして自動的にテーブルを生成します(または既存のシーケンス・テーブルを使用します).シーケンステーブルを指定しないと、デフォルトのシーケンステーブルが生成され、テーブル内のカラム名も自動生成され、データベースにsequenceというテーブル(SEQ_NAME,SEQ_COUNT)が生成されます.シーケンス・テーブルには、一般に2つのフィールドしか含まれません.1つ目のフィールドは生成ポリシーの名前で、2つ目のフィールドはリレーショナル・テーブルの最大シーケンス番号で、データの挿入に伴って徐々に加算されます.に似ている
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "roleSeq")
    @TableGenerator(name = "roleSeq", allocationSize = 1, table = "seq_table", pkColumnName = "seq_id", valueColumnName = "seq_count")
    private Integer id;


上記の例では、roleSeqはジェネレータを一意に識別し、@GeneratedValue注記のgeneratorプロパティは、この識別に基づいてプライマリ・キージェネレータを宣言することができる.
2.GenerationType.SEQUENCE
一部のデータベースでは、Oracleなどのプライマリ・キーの自己成長はサポートされていません.これは、シーケンス(sequence)と呼ばれるメカニズムによってプライマリ・キーを生成します.ここで、GenerationType.SEQUENCEはプライマリ・キーとしてポリシーを生成できます.このポリシーの不足点はTABLEとは正反対であり、一部のデータベース(Oracle,PostgreSQL,DB 2)のみがシーケンスオブジェクトをサポートしているため、このポリシーは一般的に他のデータベースでは使用されません.同様に、このポリシーは、通常、他の注釈とともに@SequenceGeneratorを使用する、@SequenceGenerator注釈は、プライマリ・キーを生成するシーケンスを指定する.その後、JPAは注釈の内容に基づいてシーケンスを作成します(または既存のシーケンスを使用します).シーケンスを指定しないと、シーケンスSEQ_が自動的に生成されます.GEN_SEQUENCE.に似ている
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "menuSeq")
    @SequenceGenerator(name = "menuSeq", initialValue = 1, allocationSize = 1, sequenceName = "MENU_SEQUENCE")
    private Integer id;


同様に、上記の例ではmenuSeqはこのジェネレータを一意に識別しており、@SequenceGeneratorはデータベースに存在するシーケンスをマッピングしたものと理解することができ、@GeneratedValue注釈のgenerator属性はこの識別に基づいてプライマリ・キージェネレータを宣言することができる.
3.GenerationType.IDENTITY
このプライマリ・キー生成ポリシーは、通常、プライマリ・キーの自己成長と呼ばれ、データベースがデータを挿入すると、プライマリ・キーに自動的に値が割り当てられます.たとえば、MYSQLは、テーブルの作成時にauto_incrementを宣言してプライマリ・キーの自己成長を指定できます.このポリシーは、ほとんどのデータベースでサポートされています(指定方法やキーワードが異なる場合があります).ただし、一部のデータベースではサポートされていないため、移植性がやや劣っています.自己成長プライマリ・キー生成ポリシーはstrategy=GenerationTypeを宣言するだけである.IDENTITYでいいです.に似ている
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;


同じテーブルの自己増分列は最大1列しかないことに注意してください.4.GenerationType.AUTO
プライマリ・キー生成ポリシーを永続化エンジン(persistence engine)に渡し、永続化エンジンはデータベースに基づいて以上の3つのプライマリ・キー生成ポリシーのうちの1つを選択します.JPAのデフォルトの生成ポリシーがGenerationTypeであるため、このようなプライマリ・キー生成ポリシーが一般的である.AUTOであるため、このようなポリシーを用いる場合.@GeneratedValue(strategy=GenerationType.AUTO)を明示的に指定してもよいし、直接@GeneratedValueと類似していてもよい
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

または
    @GeneratedValue
    private Integer id;