Ich habe eine Einheit definiert, mit einer sequenz erzeugten Primärschlüssel:Ruhe zwei unterschiedliche Sequenz Ids für PostgreSQL Erzeugen Insert
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_key_gen")
@SequenceGenerator(name = "id_key_gen", sequenceName = "id_key_seq")
@Column(name = "id", unique = true, nullable = false)
public int getId() {
return this.id;
}
I PostgreSQL bin mit, und dieser Schlüssel wird als eine serielle definiert. Nach PostgreSQL
select last_value from id_key_seq;
kehren
1603.
Wenn ich eine create() eine Instanz dieser Einheit bestehen bleiben, ich folgend in meinem Logs bin zu sehen (nicht verwandte Sachen bearbeitet out):
05 15: 15: 26,948 org.hibernate.id.enhanced.SequenceStructure [DEBUG] - Sequenzwert erhalten: 1604
05 15: 15: 26,948 org.hibernate.event.def.AbstractSaveEventListener [DEBUG] - generierten Identifikator: 1554 Strategie: org.hibernate.id.enhanced.SequenceStyleGenerator
Anschließende Insert-Anweisungen beziehen sich auf SQL der Wert 1554, nicht was es ist sollte verwenden, 1604 (basierend auf dem Wert von der SequenceStructure zurückgegeben. Woher hat Hibernate 1554 bekommen?
Scheint mir Hibernate hat hier einen Fehler - SequenceStructure kennt den korrekten nächsten Wert, aber es wird nicht verwendet. Irgendeine Idee, wie man das löst?
FYI: Ich bin bewusst von this page, which says to use GenerationType.AUTO, weil die "Hibernate Leute dies völlig vermasselt", aber es gibt nicht viel darüber hinaus nicht sehr hilfreiche Aussage.
Danke @araqnid, Einstellung von Zuweisungsgröße zu 1 funktioniert, aber ich bin neugierig auf den Kommentar, dass dieser Ansatz nicht "gute Praxis" ist. – Jay
Die Einstellung von allocationSize auf 1 ist ein degenerierter Fall, wodurch ein Generator im HiLo-Stil wie ein normaler Sequenzgenerator arbeitet. OTOH, es ist was du brauchst, also benutze es. Wenn Sie sich den Code in Hibernate 3.5 ansehen, wird die Zuweisungsgröße verwendet, um eine Optimizer-Implementierung auszuwählen, so dass sie jetzt korrekt gehandhabt wird. – araqnid
Meiner Meinung nach muss das Hibernate-Team seine Implementierung überdenken; es ist verwirrend und unnötig. Die Einstellung von allocationSize auf 1 ist genau das, was ich brauchte, aber ich frage mich, ob dies nicht der Standard für SEQUENCE auf PostgreSQL sein sollte. – Jay