69

Doctrineのドキュメントでは、@GeneratedValue注釈にはいくつかの異なる戦略が存在すると述べています。

  • AUTO
  • SEQUENCE
  • TABLE
  • IDENTITY
  • UUID
  • CUSTOM
  • NONE

誰かがすべての戦略の違いを説明してもらえますか?

4

3 に答える 3

105

最新の教義文書を確認してください

ここに要約があります:可能な生成戦略のリスト:

AUTO(デフォルト):使用されているデータベースプラットフォームで優先される戦略を選択するようにDoctrineに指示します。推奨される戦略はIDENTITY、MySQL、SQLite、MsSQL、およびSEQUENCEOracleとPostgreSQLです。この戦略は完全な移植性を提供します。

シーケンス:生成にデータベースシーケンスを使用するようにDoctrineに指示しますID。この戦略は現在、完全な移植性を提供していません。シーケンスは、Oracle、PostgreSql、およびSQLAnywhereでサポートされています。

IDENTITY:行の挿入時に値を生成するデータベース内の特別なID列を使用するようにDoctrineに指示します。この戦略は現在、完全な移植性を提供しておらず、次のプラットフォームでサポートされています。

  • MySQL / SQLite / SQL Anywhere =>AUTO_INCREMENT
  • MSSQL =>IDENTITY
  • PostgreSQL =>SERIAL

TABLE:生成に別のテーブルを使用するようにDoctrineに指示しますID。この戦略は完全な移植性を提供します。この戦略はまだ実装されていません!

NONE:識別子がコードによって割り当てられて生成されることをDoctrineに通知します。新しいエンティティがEntityManager#persistに渡される前に、割り当てを行う必要があります。完全に除外NONEするのと同じです。@GeneratedValue

バージョン2.3以降:

UUID:組み込みのUniversallyUniqueIdentifierジェネレーターを使用するようにDoctrineに指示します。この戦略は完全な移植性を提供します。

于 2012-12-25T08:42:07.950 に答える
6

もちろん、受け入れられた答えは正しいですが、次のようにマイナーな更新が必要です。

ドキュメントの注釈セクションによると:

このアノテーションはオプションであり、@Idと組み合わせて使用​​した場合にのみ意味があります。このアノテーションが@Idで指定されていない場合、デフォルトとしてNONEストラテジーが使用されます。

戦略属性はオプションです

ドキュメントの基本的なマッピングのセクションによると:

SEQUENCE:ID生成にデータベースシーケンスを使用するようにDoctrineに指示します。この戦略は現在、完全な移植性を提供していません。シーケンスは、OraclePostgreSql、およびSQLAnywhereでサポートされています。

IDENTITY:行の挿入時に値を生成するデータベース内の特別なID列を使用するようにDoctrineに指示します。この戦略は現在、完全な移植性を提供しておらず、次のプラットフォームでサポートされています。

  • MySQL / SQLite / SQL Anywhere(AUTO_INCREMENT)
  • MSSQL(IDENTITY)
  • PostgreSQL(シリアル)。

反対票を投じる

誰かからの反対票については、 SQL Anywhereが追加されており、承認された回答にはマイナーな更新が必要であることに注意してください。

于 2016-10-22T19:55:27.077 に答える
2

プログラマーの観点からは、これらはすべて同じ結果を達成します。つまり、主キーフィールドに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戦略がデフォルトであり、このオプションを使用すると、永続性プロバイダーは使用されているデータベースに最適な戦略を選択します。

于 2018-12-28T04:08:54.173 に答える