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.IDENTITY
・ GenerationType.SEQUENCE
・ GenerationType.TABLE
・ GenerationType.AUTO
J'ai examiné la différence entre chaque SGBD.
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