Wir alle kennen das Standardverhalten von Hibernate bei der Verwendung @SequenceGenerator
- es erhöht die reale Datenbanksequenz um eins , multipliziert diesen Wert um 50 (Standardwert allocationSize
) - und verwendet diesen Wert dann als Entitäts-ID.
Dies ist ein falsches Verhalten und widerspricht der Spezifikation, die besagt:
Zuordnungsgröße - (Optional) Der Betrag, um den beim Zuweisen von Sequenznummern aus der Sequenz erhöht werden soll.
Um es klar auszudrücken: Ich kümmere mich nicht um Lücken zwischen generierten IDs.
Ich interessiere mich für IDs, die nicht mit der zugrunde liegenden Datenbanksequenz übereinstimmen . Beispiel: Jede andere Anwendung (die z. B. einfaches JDBC verwendet) möchte möglicherweise neue Zeilen unter IDs einfügen, die aus der Sequenz erhalten wurden. Alle diese Werte werden jedoch möglicherweise bereits von Hibernate verwendet. Wahnsinn.
Kennt jemand eine Lösung für dieses Problem (ohne die allocationSize=1
Leistung einzustellen und damit zu beeinträchtigen)?
EDIT:
Um die Dinge klar zu machen. Wenn der zuletzt eingefügte Datensatz die ID = hatte 1
, verwendet HB Werte 51, 52, 53...
für seine neuen Entitäten, ABER gleichzeitig: Der Wert der Sequenz in der Datenbank wird auf gesetzt 2
. Dies kann leicht zu Fehlern führen, wenn andere Anwendungen diese Sequenz verwenden.
Auf der anderen Seite: Die Spezifikation besagt (nach meinem Verständnis), dass die Datenbanksequenz auf eingestellt sein sollte 51
und in der Zwischenzeit sollte HB Werte aus dem Bereich verwenden 2, 3 ... 50
UPDATE:
Wie Steve Ebersole unten erwähnte: Das von mir beschriebene (und für viele auch intuitivste) Verhalten kann durch Einstellen aktiviert werden hibernate.id.new_generator_mappings=true
.
Danke an alle.
UPDATE 2:
Für zukünftige Leser finden Sie unten ein funktionierendes Beispiel.
@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>
save
die Datenbank nach dem nächsten Wert der Sequenz abfragen muss.
SequenceGenerator
Hibernate wird die Datenbank nur abgefragt, wenn die Anzahl der durch angegebenen IDs erschöpft allocationsize
ist. Wenn Sie einrichten, allocationSize = 1
ist dies der Grund, warum der Ruhezustand die Datenbank für jede Einfügung abfragt. Ändern Sie diesen Wert, und Sie sind fertig.
hibernate.id.new_generator_mappings
Einstellung ist wirklich wichtig. Ich würde hoffen, dass es die Standardeinstellung ist, dass ich nicht so viel Zeit damit verbringen muss zu recherchieren, warum die ID-Nummer wild wird.