Doctrineのドキュメントでは、@GeneratedValue
注釈にはいくつかの異なる戦略が存在すると述べています。
AUTO
SEQUENCE
TABLE
IDENTITY
UUID
CUSTOM
NONE
誰かがすべての戦略の違いを説明してもらえますか?
Doctrineのドキュメントでは、@GeneratedValue
注釈にはいくつかの異なる戦略が存在すると述べています。
AUTO
SEQUENCE
TABLE
IDENTITY
UUID
CUSTOM
NONE
誰かがすべての戦略の違いを説明してもらえますか?
最新の教義文書を確認してください
ここに要約があります:可能な生成戦略のリスト:
AUTO(デフォルト):使用されているデータベースプラットフォームで優先される戦略を選択するようにDoctrineに指示します。推奨される戦略はIDENTITY
、MySQL、SQLite、MsSQL、およびSEQUENCE
OracleとPostgreSQLです。この戦略は完全な移植性を提供します。
シーケンス:生成にデータベースシーケンスを使用するようにDoctrineに指示しますID
。この戦略は現在、完全な移植性を提供していません。シーケンスは、Oracle、PostgreSql、およびSQLAnywhereでサポートされています。
IDENTITY:行の挿入時に値を生成するデータベース内の特別なID列を使用するようにDoctrineに指示します。この戦略は現在、完全な移植性を提供しておらず、次のプラットフォームでサポートされています。
AUTO_INCREMENT
IDENTITY
SERIAL
TABLE:生成に別のテーブルを使用するようにDoctrineに指示しますID
。この戦略は完全な移植性を提供します。この戦略はまだ実装されていません!
NONE:識別子がコードによって割り当てられて生成されることをDoctrineに通知します。新しいエンティティがEntityManager#persistに渡される前に、割り当てを行う必要があります。完全に除外NONE
するのと同じです。@GeneratedValue
UUID:組み込みのUniversallyUniqueIdentifierジェネレーターを使用するようにDoctrineに指示します。この戦略は完全な移植性を提供します。
もちろん、受け入れられた答えは正しいですが、次のようにマイナーな更新が必要です。
ドキュメントの注釈セクションによると:
このアノテーションはオプションであり、@Idと組み合わせて使用した場合にのみ意味があります。このアノテーションが@Idで指定されていない場合、デフォルトとしてNONEストラテジーが使用されます。
戦略属性はオプションです。
ドキュメントの基本的なマッピングのセクションによると:
SEQUENCE
:ID生成にデータベースシーケンスを使用するようにDoctrineに指示します。この戦略は現在、完全な移植性を提供していません。シーケンスは、Oracle、PostgreSql、およびSQLAnywhereでサポートされています。
IDENTITY
:行の挿入時に値を生成するデータベース内の特別なID列を使用するようにDoctrineに指示します。この戦略は現在、完全な移植性を提供しておらず、次のプラットフォームでサポートされています。
- MySQL / SQLite / SQL Anywhere(AUTO_INCREMENT)
- MSSQL(IDENTITY)
- PostgreSQL(シリアル)。
誰かからの反対票については、 SQL Anywhereが追加されており、承認された回答にはマイナーな更新が必要であることに注意してください。
プログラマーの観点からは、これらはすべて同じ結果を達成します。つまり、主キーフィールドにUNIQUE値を提供します。厳密に言えば、さらに2つの条件も満たされます。つまり、キーも必須であり、nullではない必要があります。
唯一の違いは、主キー値を提供する内部実装にあります。さらに、パフォーマンスとデータベースの互換性の要素も考慮する必要があります。さまざまなデータベースがさまざまな戦略をサポートしています。
理解するのが最も簡単なのはSEQUENCE
であり、これは一般的に最高のパフォーマンス上の利点をもたらすものでもあります。ここで、データベースは、以下に示すように、追加のSQL呼び出しによってnextvalにアクセスされる内部シーケンスを維持します。
SELECT nextval ('hibernate_sequence')
次の値は、新しい各行の挿入中に割り当てられます。追加のSQL呼び出しにもかかわらず、パフォーマンスへの影響はごくわずかです。を使用すると、注釈SEQUENCE
を使用して初期値(デフォルトは1)と割り当てサイズ(デフォルト= 50)を指定できます。@SequenceGenerator
@SequenceGenerator(name="seq", initialValue=1, allocationSize=100)
このIDENTITY
戦略は、データベースに依存して、テーブルに追加の列を維持することで主キーを生成します。この列の次の値は、新しい行が挿入されるたびに自動的に生成されます。タイプ階層ごとに個別のIDジェネレーターが必要です。
このTABLE
戦略は、新しい行が挿入されるたびにシーケンスを保存および更新するために、個別のテーブルに依存しています。シーケンスを維持するために悲観的なロックを使用し、その結果、これらすべてのオプションの中で最も遅い戦略です。@TableGenerator
注釈を使用して、この戦略のジェネレーター名、テーブル名、およびスキーマを指定できることに注意してください。
@TableGenerator(name="book_generator", table="id_generator", schema="bookstore")
UUIDオプションを使用すると、永続性プロバイダー(Hibernateなど)は、「8dd5f315-9788-4d00-87bb-10eed9eff566」という形式のユニバーサル一意IDを生成します。このオプションを選択するには、データ型がUUIDであるフィールド宣言の上に@GeneratedValueアノテーションを適用するだけです。例えば:
@Entity
public class UUIDDemo {
@Id
@GeneratedValue
private UUID uuid;
// ...
}
最後に、AUTO
戦略がデフォルトであり、このオプションを使用すると、永続性プロバイダーは使用されているデータベースに最適な戦略を選択します。