2016-11-08 1 views
4

Ich habe eine Frage zu Postgres und GenerationType.IDENTITY vs SequenceJPA und PostgreSQL mit GenerationType.IDENTITY

In diesem Beispiel ...

@Id 
@SequenceGenerator(name="mytable_id_seq", 
        sequenceName="mytable_id_seq", 
        allocationSize=1) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, 
       generator="mytable_id_seq") 

Ich verstehe, dass ich eine Postgres-Sequenz an Angabe zu verwenden über Anmerkungen.

Allerdings habe ich eine ID-Spalte mit dem 'seriellen' Typ definiert, ich habe gelesen, dass ich einfach GenerationType.IDENTITY verwenden kann, und es wird automatisch eine db-Sequenz generieren und verwenden, um automatisch zu inkrementieren.

Wenn dies der Fall ist, sehe ich keinen Vorteil bei der Verwendung der SEQUENCE-Annotationen, es sei denn, Sie verwenden eine ganze Zahl für eine ID oder haben einen bestimmten Grund, eine andere Sequenz zu verwenden. IDENTITY ist viel weniger Code und macht es potenziell portabel über Datenbanken.

Gibt es etwas, das mir fehlt?

Vielen Dank im Voraus für die Rückmeldung.

+0

Eins wird auf INSERT erzeugt, und das andere ist nicht. Einer ist in PrePersist nicht bekannt, der andere ist bekannt. –

Antwort

4

Wenn Sie eine Spalte vom Typ SERIAL haben, wird es ausreichend sein, Ihr id Feld mit Anmerkungen versehen mit:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 

Dies wird Hibernate zu sagen, dass die Datenbank nach der Erzeugung der id Spalt suchen. Wie die Datenbank die automatische Generierung implementiert, ist herstellerspezifisch und kann für Hibernate als "transparent" angesehen werden. Hibernate muss nur wissen, dass nach dem Einfügen der Zeile für diese Zeile ein id Wert vorhanden ist, den sie irgendwie abrufen kann. Wenn Sie GenerationType.SEQUENCE verwenden, teilen Sie Hibernate mit, dass die Datenbank nicht automatisch die id-Spalte füllt. Stattdessen muss Hibernate den nächsten Sequenzwert aus der angegebenen Sequenz abrufen und diesen Wert beim Einfügen der Zeile als id-Wert verwenden. Hibernate erzeugt und fügt also die id ein.

Im Fall von Postgres wird es passieren, dass die Definition einer SERIAL Spalte durch Erstellen einer Sequenz und deren Verwendung als Standardspaltenwert implementiert wird. Aber es ist die Datenbank, die das id-Feld auffüllt, so dass Hibernate mitteilt, dass die Datenbank ID-Generierung verarbeitet.

können Diese Referenzen helfen:

http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators

https://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL

+0

Großartig. Danke für die Bestätigung meines Verständnisses! – Mike

0

ich denke, es kann hilfreich sein, wenn Sie die gleiche Sequenz, die für mehr als eine Tabelle verwenden (zum Beispiel wollen Sie eine eindeutige Kennung für viele Arten von Rechnungen) ... auch wenn Sie die Reihenfolge von der automatisch generierten Taste verfolgen möchten

Verwandte Themen