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つ目のフィールドはリレーショナル・テーブルの最大シーケンス番号で、データの挿入に伴って徐々に加算されます.例:
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