@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つの抽象パラメーターが含まれ、両方のパラメーターに対応するデフォルト値があります。に
(写真に示されているページへのリンクを添付してください:
http://docs.oracle.com/javaee/5/api/javax/persistence/GeneratedValue.html )。
さて、引き続き理解しましょう。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は、次の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
今日は以上です!に
学習は無限で無限です。