Frage

Ich habe Ruhezustand konfiguriert PostgreSQL Sequenz zu verwenden (über Annotationen) Werte für Primärschlüssel zu erzeugen ID Spalte wie folgt:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

Was ich mit dieser Konfiguration zu sehen ist, dass Hibernate bereits Zuweisung id Werte> 3000 auf persistierende, während die Abfrage von der verwendeten Sequenz zeigt die folgende:

database=# select last_value from entity_id_seq;
last_value 
------------
     69

(1 Zeile)

Fragen:
Gibt es etwas falsch oder nicht?
Sollte Ruhezustand synchron mit der Sequenztabelle?
Wenn nicht, wo speichert es die letzte erzeugte ID?

Danke.

War es hilfreich?

Lösung

Ich hatte das gleiche Problem. Es ist auf die ID bezogenen Strategien der Hibernate zuordnet. Whe n Sie wählen GenerationType.SEQUENCE , Hibernate verwendet HiLo Strategie, die zuordnet IDs in Blöcken von 50 standardmäßig. Sie müssen also explizit festlegen allocationSize Wert wie folgt aus:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

Obwohl, ich habe auch gehört, dass Meinungen HiLo Strategie mit allocationSize = 1 ist keine gute Praxis. Einige Leute empfehlen zu verwenden GenerationType.AUTO statt, wenn Sie mit der Datenbank verwaltete Sequenzen beschäftigen

Update: Ich habe am Ende mit allocationSize gehen = 1, und die Dinge scheinen zu arbeiten, wie ich jetzt erwarten. Meine Anwendung ist so, dass ich wirklich nicht Blöcke IDs müssen sowieso, also YMMV .

Andere Tipps

DO NOT USE GenerationType.SEQUENCE für Postgres Sequenzen!

Es ist völlig kontraintuitiv, aber die Hibernate Leute völlig auf diesem verkorksten. Sie verwenden müssen GenerationType.AUTO oder Ruhezustand wird demoliert Ihre Sequenzen, wenn Sie zum Neustart / bauen Sie Ihre DB haben. Es ist fast kriminell fahrlässig, dass sie dieser Code in eine Produktions Build gehen lassen würden, aber das Hibernate-Team ist eher bekannt für ihre stierköpfiger Haltungen gegenüber rundweg-falschen Positionen (überprüft ihre Position heraus LEFT JOIN, zum Beispiel).

Zuerst müssen Sie bestimmen, welche Version von Hibernate Sie verwenden. In Bezug auf den Hibernate-Core-Versionen, 3.2 ab konsistentere Unterstützung für ID-Generatoren vor allem in Bezug eingeführt in Anmerkungen definiert. Siehe http://in.relation.to/Bloggers/New323HibernateIdentifierGenerators für eine Diskussion.

Weiter 3.6 eingeführt, um eine Einstellung ( ‚hibernate.id.new_generator_mappings‘), die die Generatoren in diesem Blog das Standard JPA-Annotationen behandelt werden diskutiert macht. Die Einstellung ist falsch standardmäßig, weil Hibernate hat Rückwärtskompatibilität mit älteren Versionen zu halten. Wenn Sie das neue Verhalten wollen (die vollständig empfohlen wird), dann einfach festgelegt, dass auf true setzen.

Wie Generation behandelt wird, hängt davon ab, welche Version Sie verwenden und ob Sie ‚hibernate.id.new_generator_mappings‘ auf true eingestellt. Ich werde annehmen, dass Sie verwenden 3.6+ (da etwas älter ist, na ja, alt) und hat ‚hibernate.id.new_generator_mappings‘ Satz auf true (da, dass die Empfehlung für neue Anwendungen ist):

  1. GenerationType.AUTO -> behandelt, als GenerationType.SEQUENCE
  2. GenerationType.SEQUENCE -> Karten zur org.hibernate.id.enhanced.SequenceStyleGenerator Klasse im Blog
  3. GenerationType.TABLE -> Karten zur org.hibernate.id.enhanced.TableGenerator Klasse im Blog

In Postgres würde ich dies tun:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="\"entity_id_seq\"")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="\"pk_sequence\"")
@Column(name="\"id\"", unique=true)
private int id;

Meist mit Namen in Großbuchstaben Hibernate Notwendigkeit, entkam Anführungszeichen übergeben, um Postgres zu verstehen und die Tabellen, Spalten oder Sequenzen Namen zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top