[JAVA] So generieren Sie einen Primärschlüssel mit @GeneratedValue

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.IDENTITYGenerationType.SEQUENCEGenerationType.TABLEGenerationType.AUTO Ich habe den Unterschied zwischen den einzelnen DBMS untersucht.

Überprüfungsumgebung

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

So generieren Sie einen Primärschlüssel mit @GeneratedValue
So sortieren Sie eine Liste mit Comparator
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
So löschen Sie einen Controller usw. mit einem Befehl
[Ruby] So generieren Sie eine zufällige Alphabet-Zeichenfolge
So generieren Sie automatisch einen Konstruktor in Eclipse
[Swift] So generieren Sie eine ID, um eine bestimmte Sache eindeutig zu identifizieren (mithilfe der UUID)
So verwenden Sie ein Array für den TreeMap-Schlüssel
So generieren Sie manuell ein JWT mit Knock in Rails
So löschen Sie benutzerdefinierte Adapterelemente mithilfe eines benutzerdefinierten Modells
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Wie hinterlasse ich einen Kommentar?
So fügen Sie ein Video ein
So erstellen Sie eine Methode
So autorisieren Sie mit graphql-ruby
So geben Sie Array-Werte ohne Verwendung einer for-Anweisung aus
So verbinden Sie eine Tabelle ohne DBFlute und SQL
So registrieren Sie sich mit Tomcat als Kunde in Square
So erstellen Sie einen Java-Container
Wie unterschreibe ich Minecraft MOD?
So erstellen Sie einen JDBC-Treiber
So erstellen Sie einen Begrüßungsbildschirm
So erstellen Sie ein Jenkins-Plug-In
Wie erstelle ich ein Maven-Projekt?
So erstellen Sie ein Java-Array
So erstellen Sie CloudStack mit Docker
So erstellen Sie eine JAR-Datei und eine War-Datei mit dem Befehl jar
So erstellen Sie mit SPRING INITIALIZR einen Hinadan für ein Spring Boot-Projekt
[Rails 6] So erstellen Sie mit cocoon einen dynamischen Formular-Eingabebildschirm
So benennen Sie ein Modell mit externen Schlüsseleinschränkungen in Rails um
Wie man einen revolutionären Diamanten mit Java für Aussage macht wwww
So erstellen Sie eine Java-Kalenderzusammenfassung
Ein Memorandum zur Verwendung von Eclipse
Zurückgeben eines Werts vom Modell an den Controller mithilfe des [Swift5] -Protokolls
So implementieren Sie eine Diashow mit Slick in Rails (einzeln und mehrfach nacheinander)
[Rails] So laden Sie Bilder mit Carrierwave hoch
So erstellen Sie eine Abfrage mithilfe von Variablen in GraphQL [Verwenden von Ruby on Rails]
[Basic] So schreiben Sie ein Dockerfile Selbstlernend ②
So fügen Sie ein Video in Rails ein
[Java] So berechnen Sie das Alter mit LocalDate
So fügen Sie einen neuen Hash / Array hinzu
[Einführung in Java] So schreiben Sie ein Java-Programm
So erstellen Sie ein Maven-Repository für 2020
Wie erstelle ich einen Discord Bot (Java)
[Java] Wie man mit der String-Klasse an die Spitze eines bestimmten Strings kommt
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
[Rails] So erstellen Sie eine Teilvorlage
So löschen Sie Daten mit einem externen Schlüssel
[Swift5] So implementieren Sie Animationen mit "lottie-ios"
SSH in Ubuntu von einem Terminal mit öffentlicher Schlüsselauthentifizierung
So implementieren Sie die Image-Veröffentlichung mithilfe von Schienen