[JAVA] Comment générer une clé primaire à l'aide de @GeneratedValue

Dans JPA, vous pouvez utiliser @ GeneratedValue pour générer automatiquement une valeur unique pour la clé primaire et l'appliquer à un champ avec @ Id. Il existe quatre façons de générer la valeur de cette clé primaire. ・ GenerationType.IDENTITYGenerationType.SEQUENCEGenerationType.TABLEGenerationType.AUTO J'ai examiné la différence entre chaque SGBD.

Environnement de vérification

GenerationType.IDENTITY Utilisez la colonne d'identité de la table pour générer la valeur de clé primaire.

@Entity
@Table(name="users")
public class User implements Serializable {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="userid")
	private long userId;
	
	@Column(name="username")
	private String userName;
	
	@Column(name="password")
	private String password;
	
	@Column(name="email")
	private String email;
        
	...
}

Pour PostgreSQL, le type de colonne de la table associée doit être SERIAL.

CREATE TABLE users
(
    userid serial NOT NULL,
    username character varying,
    password character varying,
    email character varying,
    CONSTRAINT "PK" PRIMARY KEY (userid)
)

Pour MySQL, vous devez spécifier AUTO_INCREMENT pour l'attribut de colonne.

Create TABLE users (
    userid bigint not null AUTO_INCREMENT PRIMARY KEY,
    username varchar(20),
    password varchar(20),
    email varchar(20)
);

Oracle ne prend pas en charge "GenerationType.IDENTITY".

GenerationType.SEQUENCE Générez une valeur de clé primaire à l'aide d'un objet séquence dans la base de données.

@Entity
@Table(name="users")
public class User implements Serializable {
	
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "userid_seq")
	@SequenceGenerator(name = "userid_seq", sequenceName = "userid_seq", allocationSize = 1)
	@Column(name="userid")
	private long userId;
	
	@Column(name="username")
	private String userName;
	
	@Column(name="password")
	private String password;
	
	@Column(name="email")
	private String email;
        
	...
}

Pour PostgreSQL, l'objet séquence spécifié dans sequenceName est requis.

CREATE SEQUENCE userid_seq
    INCREMENT 1
    MINVALUE 1
    MAXVALUE 10000
    START 1
    CACHE 1
    CYCLE;

GenerationType.SEQUENCE n'est pas disponible car MySQL ne prend pas en charge les séquences.

Comme PostgreSQL, Oracle nécessite un objet séquence spécifié.

create sequence "USERID_SEQ"
    start with 1
    increment by 1
    maxvalue 10000
    minvalue 1
    nocache
    cycle
    noorder

GenerationType.TABLE Générez la valeur de clé primaire à l'aide du tableau pour contenir la valeur de clé primaire.

@Entity
@Table(name="users")
public class User implements Serializable {
	
	@Id
	@TableGenerator( name = "seqTable", table = "seq_table", pkColumnName = "seq_name", pkColumnValue = "user_seq", valueColumnName = "seq_value", initialValue = 1, allocationSize = 1 )
	@GeneratedValue(strategy = GenerationType.TABLE, generator="seqTable")
	@Column(name="userid")
	private long userId;
	
	@Column(name="username")
	private String userName;
	
	@Column(name="password")
	private String password;
	
	@Column(name="email")
	private String email;
        
	...
}

PostgreSQL, MySQL et Oracle sont tous compatibles et vous devez créer l'objet de table spécifié.

--postgresql
CREATE TABLE seq_table
(
    seq_name character varying NOT NULL,
    seq_value bigint,
    CONSTRAINT seq_pk PRIMARY KEY (seq_name)
)

GenerationType.AUTO Sélectionnez une méthode différente pour chaque base de données et générez une valeur de clé primaire.

@Entity
@Table(name="users")
public class User implements Serializable {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="userid")
	private long userId;
	
	@Column(name="username")
	private String userName;
	
	@Column(name="password")
	private String password;
	
	@Column(name="email")
	private String email;
        
	...
}

Pour PostgreSQL, utilisez l'objet séquence hibernate_sequence. Si cette séquence n'existe pas, vous obtiendrez le message d'erreur ʻorg.postgresql.util.PSQLException: ERREUR: La relation "hibernate_sequence" n'existe pas`.

Pour MySQL, cela fonctionne de la même manière que «GenerationType.IDENTITY». Si AUTO_INCREMENT n'est pas spécifié pour l'attribut de colonne, le message d'erreur java.sql.SQLException: le champ'ID utilisateur 'n'a pas de valeur par défaut s'affiche.

Pour Oracle, comme pour PostgreSQL, l'objet séquence hibernate_sequence est utilisé.

Recommended Posts

Comment générer une clé primaire à l'aide de @GeneratedValue
Comment trier une liste à l'aide du comparateur
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
Comment supprimer un contrôleur, etc. à l'aide d'une commande
[Ruby] Comment générer une chaîne de caractères d'alphabet aléatoire
Comment générer automatiquement un constructeur dans Eclipse
[Swift] Comment générer un identifiant pour identifier de manière unique une certaine chose (en utilisant UUID)
Comment utiliser un tableau pour la clé TreeMap
Comment générer manuellement un JWT avec Knock in Rails
Comment supprimer des éléments d'adaptateur personnalisés à l'aide d'un modèle personnalisé
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment laisser un commentaire
Comment insérer une vidéo
Comment créer une méthode
Comment autoriser à l'aide de graphql-ruby
Comment générer des valeurs de tableau sans utiliser d'instruction for
Comment joindre une table sans utiliser DBFlute et SQL
Comment s'inscrire en tant que client dans Square à l'aide de Tomcat
Comment créer un conteneur Java
Comment signer Minecraft MOD
Comment créer un pilote JDBC
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Comment faire un projet Maven
Comment créer un tableau Java
Comment créer CloudStack à l'aide de Docker
Comment créer un fichier jar et un fichier war à l'aide de la commande jar
Comment créer un hinadan pour un projet Spring Boot à l'aide de SPRING INITIALIZR
[Rails 6] Comment créer un écran de saisie de formulaire dynamique à l'aide de cocoon
Comment renommer un modèle avec des contraintes de clé externes dans Rails
Comment faire un diamant révolutionnaire en utilisant Java pour déclaration wwww
Comment créer un résumé de calendrier Java
Un mémorandum sur l'utilisation d'Eclipse
Comment renvoyer une valeur du modèle au contrôleur en utilisant le protocole [Swift5]
Comment mettre en œuvre un diaporama en utilisant Slick in Rails (un par un et plusieurs par un)
[Rails] Comment télécharger des images à l'aide de Carrierwave
Comment créer une requête à l'aide de variables dans GraphQL [Utilisation de Ruby on Rails]
[Basique] Comment écrire un auto-apprentissage Dockerfile ②
Comment insérer une vidéo dans Rails
[Java] Comment calculer l'âge à l'aide de LocalDate
Comment ajouter un nouveau hachage / tableau
[Introduction à Java] Comment écrire un programme Java
Comment créer un référentiel Maven pour 2020
Comment créer un robot Discord (Java)
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
[Swift5] Comment créer un écran de démarrage
[rails] Comment créer un modèle partiel
Comment supprimer des données avec une clé externe
[Swift5] Comment mettre en œuvre une animation à l'aide de "lottie-ios"
Comment SSH dans Ubuntu à partir d'un terminal avec authentification par clé publique
Pour implémenter la publication d'images à l'aide de rails