Seltsames Hibernate/Oracle-Verhalten bei @SequenceGenerator

Situation: Ich habe eine Menge von Entitäten (Oracle-Schema), die mittels der Klassen-Annotation @SequenceGenerator und dann entsprechend der Attribut-Annotation @GeneratedValue eine Sequenz zugeordnet werden.

Problem: Obwohl sich durch die Log zweifelsfrei zeigen lässt, dass Hibernate die Sequenz abfragt und auch den nächsten Wert enthält, ignoriert Hibernate dies beim eigentlichen Einfügen des neuen Tupels. Stattdessen wird wahlweise irgendeine Integerzahl wie 250, 500 oder auch gerne mal 1412 kollisionsfrei verwendet. Auch den eingebauten ID-Generator mit Zahlen jenseits von 99999 wird gerne verwendet, was dann zu netten „Hey, dass passt doch gar nicht in das Feld rein!“-Fehlern führt.

Erst folgende, zusätzliche Einstellung als Eigenschaft für @SequenceGenerator scheint Hibernate dazu zu bewegen, doch die Sequence zu verwenden: allocationSize 1. (impliziert so gesehen die Sequenz).

@SequenceGenerator(name = „LOCAL_GENERATOR“, sequenceName = „SEQ_NAME“, allocationSize = 1)

Dürfte ein Bug sein.

2 Gedanken zu „Seltsames Hibernate/Oracle-Verhalten bei @SequenceGenerator“

  1. Der @SequenceGenerator multipliziert den aus der Sequence gezogenen Wert immer mit der allicationSize, die default-mäßig 50 beträgt. Damit werden DB-Rountrips bei jedem Insert gespart, weil in memory ein Block von 50 IDs vergeben werden kann.

    Mit allocationSize = 1 hat man u.U. aber ein anderes Problem, da nämlich die generate()-Methode des @SequenceGenerator synchronized ist und das u.U. unter Last zu Skalierungsproblemen führt.

    Besser ist es da auf den „alten“ Hibernate Sequence-Generator zurückzugreifen, indem man @GenericGenerator mit strategy = „sequence“ benutzt, hier ein Beispiel:

    @GenericGenerator(name = „seqGenName“, strategy = „sequence“, parameters = {
    @Parameter(name = „sequence“, value = „SEQ_DB_NAME“)
    })
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = „seqGenName“)
    private Long id;

    Hier noch ein Link zu dem Thema:

    http://itdevworld.wordpress.com/2009/12/20/hibernate-sequencegenerator-with-allocationsize1-leads-to-huge-contention/

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.