JPAプライマリ・キー生成ポリシー
7764 ワード
@GeneratedValue:
エンティティクラスに固有のプライマリ・キーを生成します(JPAではエンティティごとにEntityが必要で、プライマリ・キーが1つしかない必要があります).strategyとgeneratorの2つのプロパティがあります.
Generator:デフォルトは空の文字列で、プライマリ・キー・ジェネレータの名前を定義します.対応するジェネレータには、同じ名前のプライマリ・キー・ジェネレータ@SequenceGeneratorと@Table Generatorの2つがあります.
strategy:全部で4種類あり、列挙クラスGenerationTypeに定義されています.TABLE、SEQUENCE、IDENTITY、AUTOが含まれています.
1.GenerationType.TABLE:特定のデータベーステーブルを使用してプライマリ・キーを保存し、永続化エンジンはリレーショナル・データベースの特定のテーブルを使用してプライマリ・キーを生成します.このポリシーの利点は、外部環境やデータベースの具体的な実装に依存せず、異なるデータベース間で容易に移植できますが、データベースの特性を十分に利用できないため、優先的に使用しません.このポリシーは一般に、@Table Generatorを別の注釈とともに使用し、@Table Generator注釈はプライマリ・キーを生成するテーブルを指定し(エンティティ・クラスで指定してもよいし、プライマリ・キー・フィールドまたは属性で指定してもよい)、JPAは注釈の内容に基づいてシーケンス・リストとして自動的にテーブルを生成します(または既存のシーケンス・テーブルを使用します).シーケンステーブルを指定しないと、デフォルトのシーケンステーブルが生成され、テーブル内のカラム名も自動生成され、データベースにsequenceというテーブル(SEQ_NAME,SEQ_COUNT)が生成されます.シーケンス・テーブルには、一般に2つのフィールドしか含まれません.1つ目のフィールドは生成ポリシーの名前で、2つ目のフィールドはリレーショナル・テーブルの最大シーケンス番号で、データの挿入に伴って徐々に加算されます.例:
2.GenerationType.SEQUENCE:一部のデータベースでは、Oracleなどのプライマリ・キーの自己成長はサポートされていません.これにより、シーケンス(sequence)と呼ばれるメカニズムによってプライマリ・キーが生成されます.ここで、GenerationType.SEQUENCEはプライマリ・キーとしてポリシーを生成できます.このポリシーの不足点はTABLEとは正反対であり、一部のデータベース(Oracle,PostgreSQL,DB 2)のみがシーケンスオブジェクトをサポートしているため、このポリシーは一般的に他のデータベースでは使用されません.同様に、このポリシーは、通常、他の注釈とともに@SequenceGeneratorを使用する、@SequenceGenerator注釈は、プライマリ・キーを生成するシーケンスを指定する.その後、JPAは注釈の内容に基づいてシーケンスを作成します(または既存のシーケンスを使用します).シーケンスを指定しないと、シーケンスSEQ_が自動的に生成されます.GEN_SEQUENCE.例:
3.GenerationType.IDENTITY:このプライマリ・キー生成ポリシーは、通常、プライマリ・キーの自己成長と呼ばれ、データベースがデータを挿入すると、プライマリ・キーに自動的に値が割り当てられます.たとえば、MYSQLは、テーブルの作成時に「auto_increment」を宣言してプライマリ・キーの自己成長を指定できます.このポリシーは、ほとんどのデータベースでサポートされています(指定方法やキーワードが異なる場合があります).ただし、一部のデータベースではサポートされていないため、移植性がやや劣っています.自己成長プライマリ・キー生成ポリシーはstrategy=GenerationTypeを宣言するだけである.IDENTITYでいいです.例:
4.GenerationType.AUTO:プライマリ・キー生成ポリシーを永続化エンジン(persistence engine)に渡し、永続化エンジンはデータベースに基づいて以上の3つのプライマリ・キー生成ポリシーのうちの1つを選択します.JPAのデフォルトの生成ポリシーがGenerationTypeであるため、このようなプライマリ・キー生成ポリシーが一般的である.AUTOであるため、このようなポリシーを用いる場合.@GeneratedValue(strategy=GenerationType.AUTO)を明示的に指定したり、直接@GeneratedValueを指定したりできます.例:
@GenericGenerator:
は、@GeneratedValueとともに使用する必要があるHIbernateが提供するカスタムプライマリ・キー・ポリシー・ジェネレータであり、@GeneratedValueのgenerator名と同じ名前のname属性を持つ必要があります.
@GenericGeneratorは、次の13種類のポリシーをサポートします.
上の12種類の戦略にnativeを加えて、全部で13種類です.実は、これがhibernateのJPA戦略に対する開拓補充である.例を挙げます.
内部プログラムに基づいて32ビット長の一意のidが計算されます.
参照先:
http://blog.csdn.net/u012493207/article/details/50846616
http://blog.csdn.net/tianxiezuomaikong/article/details/64930151
転載先:https://www.cnblogs.com/SummerinShire/p/7544897.html
エンティティクラスに固有のプライマリ・キーを生成します(JPAではエンティティごとにEntityが必要で、プライマリ・キーが1つしかない必要があります).strategyとgeneratorの2つのプロパティがあります.
Generator:デフォルトは空の文字列で、プライマリ・キー・ジェネレータの名前を定義します.対応するジェネレータには、同じ名前のプライマリ・キー・ジェネレータ@SequenceGeneratorと@Table Generatorの2つがあります.
strategy:全部で4種類あり、列挙クラスGenerationTypeに定義されています.TABLE、SEQUENCE、IDENTITY、AUTOが含まれています.
1.GenerationType.TABLE:特定のデータベーステーブルを使用してプライマリ・キーを保存し、永続化エンジンはリレーショナル・データベースの特定のテーブルを使用してプライマリ・キーを生成します.このポリシーの利点は、外部環境やデータベースの具体的な実装に依存せず、異なるデータベース間で容易に移植できますが、データベースの特性を十分に利用できないため、優先的に使用しません.このポリシーは一般に、@Table Generatorを別の注釈とともに使用し、@Table Generator注釈はプライマリ・キーを生成するテーブルを指定し(エンティティ・クラスで指定してもよいし、プライマリ・キー・フィールドまたは属性で指定してもよい)、JPAは注釈の内容に基づいてシーケンス・リストとして自動的にテーブルを生成します(または既存のシーケンス・テーブルを使用します).シーケンステーブルを指定しないと、デフォルトのシーケンステーブルが生成され、テーブル内のカラム名も自動生成され、データベースにsequenceというテーブル(SEQ_NAME,SEQ_COUNT)が生成されます.シーケンス・テーブルには、一般に2つのフィールドしか含まれません.1つ目のフィールドは生成ポリシーの名前で、2つ目のフィールドはリレーショナル・テーブルの最大シーケンス番号で、データの挿入に伴って徐々に加算されます.例:
1 @Id
2 @GeneratedValue(strategy = GenerationType.TABLE, generator = "id_sequence")
3 @TableGenerator(name = "id_sequence", allocationSize = 1, table = "sequence_table", pkColumnName = "sequence_max_id", valueColumnName = "sequence_count")
4 private int id;
2.GenerationType.SEQUENCE:一部のデータベースでは、Oracleなどのプライマリ・キーの自己成長はサポートされていません.これにより、シーケンス(sequence)と呼ばれるメカニズムによってプライマリ・キーが生成されます.ここで、GenerationType.SEQUENCEはプライマリ・キーとしてポリシーを生成できます.このポリシーの不足点はTABLEとは正反対であり、一部のデータベース(Oracle,PostgreSQL,DB 2)のみがシーケンスオブジェクトをサポートしているため、このポリシーは一般的に他のデータベースでは使用されません.同様に、このポリシーは、通常、他の注釈とともに@SequenceGeneratorを使用する、@SequenceGenerator注釈は、プライマリ・キーを生成するシーケンスを指定する.その後、JPAは注釈の内容に基づいてシーケンスを作成します(または既存のシーケンスを使用します).シーケンスを指定しないと、シーケンスSEQ_が自動的に生成されます.GEN_SEQUENCE.例:
1 @Id
2 @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_sequence")
3 @SequenceGenerator(name = "id_sequence", initialValue = 1, allocationSize = 1, sequenceName = "ID_SEQUENCE")
4 private int id;
3.GenerationType.IDENTITY:このプライマリ・キー生成ポリシーは、通常、プライマリ・キーの自己成長と呼ばれ、データベースがデータを挿入すると、プライマリ・キーに自動的に値が割り当てられます.たとえば、MYSQLは、テーブルの作成時に「auto_increment」を宣言してプライマリ・キーの自己成長を指定できます.このポリシーは、ほとんどのデータベースでサポートされています(指定方法やキーワードが異なる場合があります).ただし、一部のデータベースではサポートされていないため、移植性がやや劣っています.自己成長プライマリ・キー生成ポリシーはstrategy=GenerationTypeを宣言するだけである.IDENTITYでいいです.例:
1 @Id
2 @GeneratedValue(strategy = GenerationType.IDENTITY)
3 private int id;
4.GenerationType.AUTO:プライマリ・キー生成ポリシーを永続化エンジン(persistence engine)に渡し、永続化エンジンはデータベースに基づいて以上の3つのプライマリ・キー生成ポリシーのうちの1つを選択します.JPAのデフォルトの生成ポリシーがGenerationTypeであるため、このようなプライマリ・キー生成ポリシーが一般的である.AUTOであるため、このようなポリシーを用いる場合.@GeneratedValue(strategy=GenerationType.AUTO)を明示的に指定したり、直接@GeneratedValueを指定したりできます.例:
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@GenericGenerator:
は、@GeneratedValueとともに使用する必要があるHIbernateが提供するカスタムプライマリ・キー・ポリシー・ジェネレータであり、@GeneratedValueのgenerator名と同じ名前のname属性を持つ必要があります.
@GenericGeneratorは、次の13種類のポリシーをサポートします.
1 static {
2
3 GENERATORS.put("uuid", UUIDHexGenerator.class);
4
5 GENERATORS.put("hilo", TableHiLoGenerator.class);
6
7 GENERATORS.put("assigned", Assigned.class);
8
9 GENERATORS.put("identity", IdentityGenerator.class);
10
11 GENERATORS.put("select", SelectGenerator.class);
12
13 GENERATORS.put("sequence", SequenceGenerator.class);
14
15 GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);
16
17 GENERATORS.put("increment", IncrementGenerator.class);
18
19 GENERATORS.put("foreign", ForeignGenerator.class);
20
21 GENERATORS.put("guid", GUIDGenerator.class);
22
23 GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated
24
25 GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);
26
27 }
上の12種類の戦略にnativeを加えて、全部で13種類です.実は、これがhibernateのJPA戦略に対する開拓補充である.例を挙げます.
1 @GeneratedValue(generator = "paymentableGenerator")
2 @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
3 private int id;
内部プログラムに基づいて32ビット長の一意のidが計算されます.
参照先:
http://blog.csdn.net/u012493207/article/details/50846616
http://blog.csdn.net/tianxiezuomaikong/article/details/64930151
転載先:https://www.cnblogs.com/SummerinShire/p/7544897.html