Les différences entre les stratégies GeneratedValue
Dans le La Doctrine docs ils mentionnent qu'il existe plusieurs stratégies différentes pour la @GeneratedValue
annotation:
AUTO
SEQUENCE
TABLE
IDENTITY
UUID
CUSTOM
NONE
Quelqu'un pour expliquer les différences entre tous les thees stratégies?
Vous devez vous connecter pour publier un commentaire.
Vérifier la dernière doctrine de la documentation
Voici un résumé :
la liste des possibles stratégies de génération:
AUTO (par défaut): Indique la Doctrine de choisir la stratégie qui est préféré par la base de données utilisée plate-forme. Les meilleures stratégies sont
IDENTITY
pour MySQL, SQLite et MsSQL etSEQUENCE
pour Oracle et PostgreSQL. Cette stratégie permet une portabilité totale.SÉQUENCE: Dit la Doctrine de l'utilisation d'une base de données de séquence pour
ID
génération. Cette stratégie n'est actuellement pas fournir une portabilité complète. Les séquences sont pris en charge par Oracle et PostgreSql.IDENTITÉ: Dit la Doctrine de l'utilisation particulière des colonnes d'identité dans la base de données qui génèrent une valeur lors de l'insertion d'une ligne. Cette stratégie n'est actuellement pas fournir une portabilité complète et est pris en charge par les plates-formes suivantes:
AUTO_INCREMENT
IDENTITY
SERIAL
TABLE: Dit la Doctrine d'utiliser une table séparée pour
ID
génération. Cette stratégie permet une portabilité totale. Cette stratégie n'est pas encore mise en œuvre!AUCUN: Dit la Doctrine que les identifiants sont attribués, et ainsi généré, par votre code. La cession doit avoir lieu avant qu'une nouvelle entité est passé à l'EntityManager#persistent.
NONE
est le même que laissant le@GeneratedValue
entièrement.DEPUIS LA VERSION 2.3 :
UUID: Dit la Doctrine d'utiliser le construit en Identifiant Unique universel générateur. Cette stratégie permet une portabilité totale.
Bien sûr accepté la réponse est correcte, mais il a besoin d'un mineur mise à jour comme suit:
Selon Annotation section de la la documentation:
Selon Cartographie de Base section de la la documentation:
Downvote
Concernant le downvote donné par quelqu'un, il convient de noter que SQL Anywhere a été ajouté et la accepté de répondre aux besoins d'un mineur mise à jour.
Du point de vue du programmeur, ils ont tous obtenir le même résultat: c'est de donner une valeur UNIQUE pour le champ de clé primaire. Strictement parlant, il y a deux autres conditions sont également remplies, à savoir: la clé doit être obligatoire, et pas null.
Les seules différences résident dans les implémentations internes qui fournissent la valeur de la clé primaire. En outre, il y a de la performance et de la base de données de compatibilité des facteurs qui doivent également être considérés. Différentes bases de données à l'appui des stratégies différentes.
Le plus simple à comprendre est
SEQUENCE
et c'est aussi, généralement, celui qui donne le meilleur avantage de performance. Ici, la base de données contient une séquence interne dont nextval est accessible par l'ajout d'un appel SQL comme illustré ci-dessous:La prochaine valeur est attribuée lors de l'insertion de chaque nouvelle ligne. Malgré le nouvel appel SQL, il est négligeable impact sur les performances. Avec
SEQUENCE
, il est possible de spécifier la valeur initiale (la valeur par défaut est 1) et aussi la répartition de la taille (par défaut=50) à l'aide de la@SequenceGenerator
annotation:La
IDENTITY
stratégie s'appuie sur la base de données pour générer la clé primaire par le maintien d'une colonne supplémentaire dans la table dont la valeur suivante est générée automatiquement chaque fois qu'une nouvelle ligne est insérée. Une identité distincte générateur est nécessaire pour chaque type de hiérarchie.La
TABLE
stratégie repose sur une table séparée pour stocker et mettre à jour la séquence à chaque nouvelle insertion de ligne. Il utilise pessimiste serrures à maintenir la séquence et comme un résultat est le plus lent de la stratégie de toutes ces options. Il peut être intéressant de noter qu'un@TableGenerator
annotation peut être utilisée pour spécifier un générateur de nom de, nom de la table et le schéma de cette stratégie:Avec l'UUID de l'option, le fournisseur de persistance (par exemple, la mise en veille) génère un ID universellement unique de la forme: '8dd5f315-9788-4d00-87bb-10eed9eff566'. Pour sélectionner cette option, il suffit d'appliquer la @GeneratedValue annotation au-dessus d'un champ de la déclaration dont le type de données est UUID; par exemple:
Enfin, la
AUTO
stratégie est la valeur par défaut et avec cette option, le fournisseur de persistance sélectionne la stratégie optimale pour la base de données utilisée.