JPA - ID mit GeneratedValue TableGenerator/SequenceGenerator

Hi,

wenn man den TableGenerator oder den SequenceGenerator für die ID einer Entity verwendet, dann kann man eine AllocationSize festlegen.

Wozu ist diese AllocationSize gut bzw. was hat man für einen Vorteil davon?

Danke!

Daniel

SequenceGenerator (Java EE 6 )

int allocationSize
(Optional) The amount to increment by when allocating sequence numbers from the sequence.

Googeln & Doku lesen ist wohl nicht dein Ding? :wink:

Damit definierst du, wie oft der Persistenzprovider auf die eigtl. Sequence Zugreift. (SELECT KUNDE_SEQ.currval FROM dual)
Bei allocationSize=1 wird bei jeder neu angelegten Entity auf die Sequence der Tabelle zugegriffen… Bei 50 zB. würde die Sequence programatisch vom
Provider bis 50 generiert und holt sich dann erst wieder für die nächsten 50 ID´s die ID´s aus der Sequence.
Der Aufruf (SELECT ANSPRECHPARTNER_SEQ.currval FROM dual) erfolgt also erst nach weiteren 50 angelegten Entitäten.

Das heißt auch, dass die nächsten 50 ID´s vergeben sind. Falls du ein weiteres Programm startest, was ja möglich ist,
würde der Provider mit der Abfrage (SELECT ANSPRECHPARTNER_SEQ.currval FROM dual) dann 50 oder 100 zurück geliefert bekommen. Je nachdem, was auf der anderen Seite bereits passiert ist.

SELECT KUNDE_SEQ.nextval FROM dual reserviert die nächsten 50 ID´s.

falls noch gar kein Gedanken dazu, dann hilft evtl. Halbwissen sicher schon etwas weiter (edit: zwischenzeitlich doch auch andere Posts) :

Objekte brauchen Ids, eine Sequence zur Vergabe steht in der DB,

sei diese z.B. gerade auf Stand 44 und AllocationSize 30
-> das JPA-System erhöht die DB-Sequence in einem Schritt auf 74 und hat nun exklusiven Zugriff auf 30 mögliche Ids,
kann sie im Laufe der Zeit (etwa aktuelle Transaktion) zuweisen, falls so viele Objekte zu speichern sind,

wenn mehr Objekte, dann nochmal 30 zu holen, wenn weniger als 30, dann verfallen eben paar Ids, auch nicht schlimm,
auf jeden Fall nicht für 30 zu speichernde Objekte 30x die DB nach neuer Id zu fragen, dieser Aufwand soll verringert werden


ob die allocationSize dafür da ist und wie genau umgestetzt, nun ja, bei mir bei Hibernate evtl. schon wieder anders

naheliegende Suche ‘SequenceGenerator AllocationSize’ findet einiges zum weiteren Studium,
liest sich für mich soweit etwas verdächtig, etwa erste Link
java - Hibernate, @SequenceGenerator and allocationSize - Stack Overflow
mit ‘multiple this value by 50’ …

in
Roy’s musings: Note on allocationSize parameter of @SequenceGenerator while using JPA
mit allocationSize=10 auch in der DB
CREATE SEQUENCE ITEM_ID_SEQ START WITH 1 INCREMENT BY 10;
nötig? das wären ja übel zwei Stellen, die zusammenpassen müssten…,
und was wenn verschiedene JPA unterschiedliche allocationSize haben, kann nicht jeder exakt seine allocationSize Ids von der Sequence ‘abheben’?

na, wie auch immer

Gegoogelt und gelesen schon, aber leider nicht verstanden :slight_smile:

Danke. Genau diese Info ist mir Abgegangen oder ist nicht so deutlich in den Dokus gestanden, dass es mir klar geworden wäre.

Plötzlich fehlten mir IDs. Das war genau der Zeitpunkt an dem ich mich fragte, was der Profit der Allocation ist.

Wenn ich eine Allocation Size von 1 festlege und einen Rollback habe, geht die ID verloren, wie es bei Identity der Fall wäre. Ich könnte es ja mühsam Testen, aber vielleicht weiß es ja jemand … :slight_smile:

‘sequence rollback’ wäre wiederum keine schwere Suche
jdbc - Oracle Sequences - Can we rollback a sequence - Stack Overflow

es gehen auch bei allocationSize=1 bis zu n Ids verloren, wenn so viele Objekte in einer Transaktion gespeichert und dann Rollback…,

die Sequence zurückzusetzen ist nicht vorgesehen und auch nicht sinnvoll,
weil ja andere nebenbei auch schon Sequence abgefragt haben können, und die nicht zurückdrehen wollen

@SlaterB
Ja, da ist was dran. Danke!