2011-01-05 10 views
4

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.

Antwort

5

Wenn Sie GenerationType.SEQUENCE verwenden, müssen Sie einen "Inkrementwert" von 1 angeben, um zu vermeiden, dass die Sequenz als Hi/Lo-Seed verwendet wird.

Die erste Antwort (die nützliche) auf die von Ihnen gepostete Frage erklärt, dass Sie in der Annotation @GeneratedValue "allocationSize = 1" angeben müssen.

Bei neueren Hibernate-Versionen können Sie stattdessen hibernate.id.new_generator_mappings=true in Ihren Hibernate-Eigenschaften festlegen; siehe the docs.

+1

Danke @araqnid, Einstellung von Zuweisungsgröße zu 1 funktioniert, aber ich bin neugierig auf den Kommentar, dass dieser Ansatz nicht "gute Praxis" ist. – Jay

+2

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

+0

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

Verwandte Themen