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つ目のフィールドはリレーショナル・テーブルの最大シーケンス番号で、データの挿入に伴って徐々に加算されます.に似ている
上記の例では、roleSeqはジェネレータを一意に識別し、@GeneratedValue注記のgeneratorプロパティは、この識別に基づいてプライマリ・キージェネレータを宣言することができる.
2.GenerationType.SEQUENCE
一部のデータベースでは、Oracleなどのプライマリ・キーの自己成長はサポートされていません.これは、シーケンス(sequence)と呼ばれるメカニズムによってプライマリ・キーを生成します.ここで、GenerationType.SEQUENCEはプライマリ・キーとしてポリシーを生成できます.このポリシーの不足点はTABLEとは正反対であり、一部のデータベース(Oracle,PostgreSQL,DB 2)のみがシーケンスオブジェクトをサポートしているため、このポリシーは一般的に他のデータベースでは使用されません.同様に、このポリシーは、通常、他の注釈とともに@SequenceGeneratorを使用する、@SequenceGenerator注釈は、プライマリ・キーを生成するシーケンスを指定する.その後、JPAは注釈の内容に基づいてシーケンスを作成します(または既存のシーケンスを使用します).シーケンスを指定しないと、シーケンスSEQ_が自動的に生成されます.GEN_SEQUENCE.に似ている
同様に、上記の例ではmenuSeqはこのジェネレータを一意に識別しており、@SequenceGeneratorはデータベースに存在するシーケンスをマッピングしたものと理解することができ、@GeneratedValue注釈のgenerator属性はこの識別に基づいてプライマリ・キージェネレータを宣言することができる.
3.GenerationType.IDENTITY
このプライマリ・キー生成ポリシーは、通常、プライマリ・キーの自己成長と呼ばれ、データベースがデータを挿入すると、プライマリ・キーに自動的に値が割り当てられます.たとえば、MYSQLは、テーブルの作成時にauto_incrementを宣言してプライマリ・キーの自己成長を指定できます.このポリシーは、ほとんどのデータベースでサポートされています(指定方法やキーワードが異なる場合があります).ただし、一部のデータベースではサポートされていないため、移植性がやや劣っています.自己成長プライマリ・キー生成ポリシーはstrategy=GenerationTypeを宣言するだけである.IDENTITYでいいです.に似ている
同じテーブルの自己増分列は最大1列しかないことに注意してください.4.GenerationType.AUTO
プライマリ・キー生成ポリシーを永続化エンジン(persistence engine)に渡し、永続化エンジンはデータベースに基づいて以上の3つのプライマリ・キー生成ポリシーのうちの1つを選択します.JPAのデフォルトの生成ポリシーがGenerationTypeであるため、このようなプライマリ・キー生成ポリシーが一般的である.AUTOであるため、このようなポリシーを用いる場合.@GeneratedValue(strategy=GenerationType.AUTO)を明示的に指定してもよいし、直接@GeneratedValueと類似していてもよい
または
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;