Ruhezustand, @SequenceGenerator und allocationSize

Wir alle kennen das Standardverhalten von Hibernate bei der Verwendung@SequenceGenerator - Erhöht die reale Datenbankreihenfolge umein, multiplizieren Sie diesen Wert mit 50 (StandardeinstellungallocationSize value) - und verwendet diesen Wert dann als Entitäts-ID.

Das ist falsches Verhalten und widersprichtSpezifikation was sagt:

allocationSize - (Optional) Der Betrag, um den erhöht werden soll, wenn Sequenznummern aus der Sequenz zugewiesen werden.

Um es klar auszudrücken: Ich kümmere mich nicht um Lücken zwischen generierten IDs.

Ich interessiere mich für IDs, die sindnicht konsistent mit zugrunde liegender Datenbanksequenz. Zum Beispiel: Jede andere Anwendung (die beispielsweise JDBC verwendet) möchte möglicherweise neue Zeilen unter den IDs einfügen, die aus der Sequenz abgerufen wurden. Alle diese Werte werden jedoch möglicherweise bereits von Hibernate verwendet! Wahnsinn.

Kennt jemand eine Lösung für dieses Problem (ohne Einstellung)?allocationSize=1 und damit Leistungseinbußen)?

BEARBEITEN:
Um die Dinge klar zu machen. Wenn der zuletzt eingefügte Datensatz ID = hatte1, dann HB Werte verwenden51, 52, 53... für seine neuen Entitäten ABER gleichzeitig: Der Wert der Sequenz in der Datenbank wird auf gesetzt2. Was leicht zu Fehlern führen kann, wenn andere Anwendungen diese Sequenz verwenden.

Auf der anderen Seite: Die Spezifikation besagt (nach meinem Verständnis), dass die Datenbanksequenz auf gesetzt werden sollte51 und in der Zwischenzeit sollte HB Werte aus dem Bereich verwenden2, 3 ... 50


AKTUALISIEREN:
Wie Steve Ebersole weiter unten erwähnte: Das von mir beschriebene (und für viele auch das intuitivste) Verhalten kann durch Einstellen aktiviert werdenhibernate.id.new_generator_mappings=true.

Danke an alle.

UPDATE 2:
Nachfolgend finden Sie ein Arbeitsbeispiel für zukünftige Leser.

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
    @SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
    private Long id;
}

persistence.xml

<persistence-unit name="testPU">
  <properties>
    <property name="hibernate.id.new_generator_mappings" value="true" />
  </properties>
</persistence-unit>

Antworten auf die Frage(5)

Ihre Antwort auf die Frage