@GeneratorValueおよび@GenericGeneratorアノテーションの使用経験



Generatorvalue Genericgenerator Annotation Use Experience



今日開発していたときは、この2つの注釈の使い方についてあまり知らなかったので、仕事を辞めた後、自分の学習結果を意図的に記録しました。に
今日のトピックに入る前に、まずいくつかの定義を理解しましょう。

JAPとは?
JPAのフルネームJava Persistence API、JDK 5.0(またはそれ以降)のアノテーションまたはXML構成メソッドで記述されているオブジェクトリレーショナルテーブルマッピング関係、およびランタイムエンティティオブジェクトはデータベースに永続化されます。



JPAとHibernateの関係は何ですか?
JPAと既存のHibernate、TopLink、JDOなどの全体的な考え方は、これらのORMフレームワークはほぼ同じです。に
私の簡単な理解は、JPAは後者のORM開発者にいくつかの「標準」を提供し、既存のテンプレートで相互に補完できるようにし、開発される最終的なORM製品は主にエンティティオブジェクトとデータベースにあるということです。永続性、およびデータベースに対するいくつかのCRUD操作。

では、今日の公式コンテンツを見てみましょう。



@GeneratorValueアノテーション
JPAインターフェース(javax.persistenceパッケージの下のJAVA EE 5以降)に属するインターフェースには、GenerationType型ストラテジーとString型ジェネレーターの2つの抽象パラメーターが含まれ、両方のパラメーターに対応するデフォルト値があります。に
JPA


(写真に示されているページへのリンクを添付してください:
http://docs.oracle.com/javaee/5/api/javax/persistence/GeneratedValue.html )。

さて、引き続き理解しましょう。GenerationTypeで選択できる値の種類と、これらの値の意味を理解しましょう。に
GenerationType




上の図から、GenerationTypeもjavax.persistenceパッケージにあり、Enum列挙型クラスも継承していることがわかります。次に、使用する4つの値があります。
TABLE:特定のデータベーステーブルを使用して、主キーを格納します。に
シーケンス:データベースがシーケンスをサポートしている場合は、基になるデータベースのシーケンスに従って主キーを生成します。この値は、主キーの生成に使用されるジェネレーターを指定するジェネレーターと一緒に使用する必要があります(orcaleで自分で作成したシーケンスの場合があります)。に
IDENTITY:主キーはデータベース(主にmysqlなどの自動拡張をサポートするデータベース)によって自動的に生成されます。
AUTO:主キーはプログラムによって制御され、GenerationTypeのデフォルト値でもあります。

使用例を以下に示します。 (私はgetterメソッドにアノテーションを付けることを好みます)

GenerationType.TABLE

@Id @GeneratedValue(strategy = GenerationType.TABLE, generator='payablemoney_gen') @TableGenerator(name = 'pk_gen', table='tb_generator', pkColumnName='gen_name', valueColumnName='gen_value', pkColumnValue='PAYABLEMOENY_PK', allocationSize=1) public long getUserId() { return userId }
  • 1
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

GenerationType.SEQUENCE

@Id @GeneratedValue(strategy = GenerationType.SEQUENCE,generator='payablemoney_seq') @SequenceGenerator(name='payablemoney_seq', sequenceName='seq_payment') public long getUserId() { return userId }
  • 1
  • 3
  • 4
  • 5
  • 6

GenerationType.IDENTITY

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) public long getUserId() { return userId }
  • 1
  • 3
  • 4
  • 5

GenerationType.AUTO

@Id @GeneratedValue(strategy = GenerationType.AUTO) public long getUserId() { return userId }
  • 1
  • 3
  • 4
  • 5

4つのデータベースでの4種類のGeneratorValue戦略のサポートは次のとおりです。

mysql
GenerationType.TABLE
GenerationType.AUTO
GenerationType.IDENTITY
GenerationType.SEQUENCEをサポートしていません

オラクル
ストラテジー= GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.TABLE
GenerationType.IDENTITYをサポートしていません

postgreSQL
GenerationType.TABLE
GenerationType.AUTO
GenerationType.IDENTITY
GenerationType.SEQUENCE
すべてのサポート

キングベース
GenerationType.TABLE
GenerationType.SEQUENCE
GenerationType.IDENTITY
GenerationType.AUTO
すべてのサポート


@GenericGeneratorアノテーション

@GenericGeneratorアノテーションは、hibernateによって提供されるカスタムの主キー生成戦略ジェネレーターであり、@ GenericGeneratorは複数の定義済み戦略を実装します。したがって、@ GeneratedValueとともに使用する必要があり、@ GeneratedValueアノテーションの「generator」属性は@GenericGeneratorアノテーションのname属性と一致している必要があります。ストラテジー属性は、Hibernateの主キー生成ストラテジーを表します。 hibernateのAPIの定義を見てみましょう。 。に
GenericGenerator

@GenericGeneratorは、次の13の戦略をサポートしています。

static { GENERATORS.put('uuid', UUIDHexGenerator.class) GENERATORS.put('hilo', TableHiLoGenerator.class) GENERATORS.put('assigned', Assigned.class) GENERATORS.put('identity', IdentityGenerator.class) GENERATORS.put('select', SelectGenerator.class) GENERATORS.put('sequence', SequenceGenerator.class) GENERATORS.put('seqhilo', SequenceHiLoGenerator.class) GENERATORS.put('increment', IncrementGenerator.class) GENERATORS.put('foreign', ForeignGenerator.class) GENERATORS.put('guid', GUIDGenerator.class) GENERATORS.put('uuid.hex', UUIDHexGenerator.class) //uuid.hex is deprecated GENERATORS.put('sequence-identity', SequenceIdentityGenerator.class) }
  • 1
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 十一
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 2. 3
  • 24
  • 25
  • 26
  • 27

上記の12の戦略とネイティブは、合計13の戦略になります。に
実際、これは休止状態からJPA戦略への拡張です。に
私は個人的に、oracleデータベースのプライマリキー生成で使用されるuuid戦略を使用しています。彼女は内部プログラムに従って32ビットの一意のIDを計算します。具体的な使用例は次のとおりです。

@GeneratedValue(generator = 'paymentableGenerator') @GenericGenerator(name = 'paymentableGenerator', strategy = 'uuid') public String getUserId() { return userId }
  • 1
  • 3
  • 4
  • 5

他のものを一つずつ追加することはしません。次の2つの優れた記事が推奨されます。これらは非常に詳細です。また、回答する前に多くの紛らわしい点を参照し、ブログ投稿のリンクを添付しました。

http://www.cnblogs.com/tobeprogramer/p/4162228.html

http://www.cnblogs.com/ph123/p/5692194.html

今日は以上です!に
学習は無限で無限です。