In JPA können Sie mit "@ GeneratedValue" automatisch einen eindeutigen Wert für den Primärschlüssel generieren und auf ein Feld mit "@ Id" anwenden. Es gibt vier Möglichkeiten, den Wert dieses Primärschlüssels zu generieren.
・ GenerationType.IDENTITY
・ GenerationType.SEQUENCE
・ GenerationType.TABLE
・ GenerationType.AUTO
Ich habe den Unterschied zwischen den einzelnen DBMS untersucht.
GenerationType.IDENTITY
Verwenden Sie die Identitätsspalte der Tabelle, um den Primärschlüsselwert zu generieren.
@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;
...
}
Für PostgreSQL muss der Spaltentyp der zugehörigen Tabelle SERIAL sein.
CREATE TABLE users
(
userid serial NOT NULL,
username character varying,
password character varying,
email character varying,
CONSTRAINT "PK" PRIMARY KEY (userid)
)
Für MySQL müssen Sie AUTO_INCREMENT für das Spaltenattribut angeben.
Create TABLE users (
userid bigint not null AUTO_INCREMENT PRIMARY KEY,
username varchar(20),
password varchar(20),
email varchar(20)
);
Oracle unterstützt "GenerationType.IDENTITY" nicht.
GenerationType.SEQUENCE
Generieren Sie einen Primärschlüsselwert mithilfe eines Sequenzobjekts in der Datenbank.
@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;
...
}
Für PostgreSQL ist das in sequenceName
angegebene Sequenzobjekt erforderlich.
CREATE SEQUENCE userid_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 10000
START 1
CACHE 1
CYCLE;
GenerationType.SEQUENCE
ist nicht verfügbar, da MySQL keine Sequenzen unterstützt.
Wie PostgreSQL benötigt Oracle ein bestimmtes Sequenzobjekt.
create sequence "USERID_SEQ"
start with 1
increment by 1
maxvalue 10000
minvalue 1
nocache
cycle
noorder
GenerationType.TABLE
Generieren Sie den Primärschlüsselwert mithilfe der Tabelle zum Speichern des Primärschlüsselwerts.
@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 und Oracle sind alle kompatibel, und Sie müssen das angegebene Tabellenobjekt erstellen.
--postgresql
CREATE TABLE seq_table
(
seq_name character varying NOT NULL,
seq_value bigint,
CONSTRAINT seq_pk PRIMARY KEY (seq_name)
)
GenerationType.AUTO
Wählen Sie für jede Datenbank eine andere Methode aus und generieren Sie einen Primärschlüsselwert.
@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;
...
}
Verwenden Sie für PostgreSQL das Sequenzobjekt hibernate_sequence. Wenn diese Sequenz nicht vorhanden ist, wird die Fehlermeldung "org.postgresql.util.PSQLException: ERROR: Relation" hibernate_sequence "existiert nicht" angezeigt.
Für MySQL funktioniert es genauso wie "GenerationType.IDENTITY". Wenn für das Spaltenattribut nicht AUTO_INCREMENT angegeben ist, wird die Fehlermeldung "java.sql.SQLException: Feld" Benutzer-ID "hat keinen Standardwert" angezeigt.
Für Oracle wird wie für PostgreSQL das Sequenzobjekt hibernate_sequence verwendet.
Recommended Posts