web-dev-qa-db-fra.com

GenerationType.AUTO vs GenerationType.IDENTITY en veille prolongée

Actuellement, nous utilisons mysql comme base de données et nous utilisons

@Generated Value(strategy = GenerationType.IDENTITY)

Cela fonctionne parfaitement dans certaines situations, nous devons migrer notre base de données vers Oracle à ce moment-là, cela ne fonctionne pas correctement.Si quelqu'un sait quelle est la différence réelle derrière cela et comment cela fonctionne?

21
sethu palaniyappan

Comment cela pourrait-il "fonctionner correctement" (vous ne définissez pas les informations de base comme ce que vous entendez par là) avec Oracle? Je ne vois pas la pertinence de AUTO pour votre question - qui laisse simplement une implémentation choisir ce qu'elle veut utiliser.

"IDENTITY" (selon les javadocs JPA et les spécifications - à quoi vous devriez vous référer) signifie auto-incrémentation. Il n'y a pas un tel concept dans Oracle, mais il y en a dans MySQL, SQLServer et quelques autres. Je m'attendrais à ce que toute mise en œuvre décente de JPA signale une erreur lorsque vous essayez même une telle chose.

Oracle autoriserait cependant l'utilisation des stratégies "SEQUENCE" ou "TABLE"

19
Neil Stockton

Citation Java Persistence/Identity and Sequencing :

Le séquençage d'identité utilise des colonnes IDENTITY spéciales dans la base de données pour permettre à la base de données de attribuer automatiquement un identifiant à l'objet lorsque sa ligne est insérée. Les colonnes d'identité sont prises en charge dans de nombreuses bases de données, telles que MySQL, DB2, SQL Server, Sybase et Postgres . Oracle ne prend pas en charge les colonnes IDENTITY mais elles peuvent être simulées à l'aide d'objets de séquence et de déclencheurs.

donc je préfère utiliser [~ # ~] séquence [~ # ~] à la place

Les objets de séquence utilisent des objets de base de données spéciaux pour générer des identifiants. Les objets de séquence ne sont pris en charge que dans certaines bases de données, comme Oracle, DB2 et Postgres. Habituellement, un objet SEQUENCE a un nom, un INCREMENT et d'autres paramètres d'objet de base de données. Chaque fois que le .NEXTVAL est sélectionné, la séquence est incrémentée par l'AUGMENTATION.

Exemple :

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="EMP_SEQ")
    @SequenceGenerator(name="EMP_SEQ", sequenceName="EMP_SEQ", allocationSize=100)
    private long id;
    ...
}
11
Ahmad Al-Kurdi