Frage

Mir ist gerade aufgefallen, dass EclipSelink für die ID meiner Entität eine ID 1 + die zuvor in derselbe Sitzung (1) zugewiesene ID zuweist, im Gegensatz zu der Element -Tabelle (2). Dies verstößt gegen meine Anwendungserwartungen.

Was ist der einfachste Weg, es zu sagen, 2 zu tun?

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int objId;

Und hier ist, was ich in der Datenbank habe:

ij> connect 'jdbc:derby:db';
ij> set schema memo;
0 Zeilen eingef?gt/aktualisiert/gel?scht
ij> select * from meaning;
OBJID      |LASTPUBLI&|USR_EMAIL                                                                                                                       
-------------------------------------------------------------------------------------------------------------------------------------------------------
1          |NULL      |NULL                                                                                                                            
2          |2010-10-27|NULL                                                                                                                            
51         |NULL      |NULL                                                                                                                            
101        |NULL      |NULL                                                                                      
War es hilfreich?

Lösung

Bei Verwendung a GenerationType.AUTO Strategie mit Derby, EclipSelink stand Tischgenerator Strategie.

Dann beim Generieren eines Id ist erforderlich, El wird IDs nach dem vorab vorhanden allocationSize (was standardmäßig 50 ist). Dazu wird zunächst die Spalte aktualisiert, in der der letzte Wert gespeichert ist, der er generiert hat, um ihn durch die zu erhöhen allocationSize:

UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
    bind => [50, SEQ_GEN]

Und wird dann den neuen Wert lesen:

SELECT SEQ_COUNT FROM SEQUENCE WHERE SEQ_NAME = ?
    bind => [SEQ_GEN]

Sobald er fertig ist, prealloziert El einen IDS -Pool mit dem Strom Wert - Zuordnungen + 1 als "zuerst" und Wert als "letztes":

local sequencing preallocation for SEQ_GEN: objects: 50 , first: 1, last: 50

Und serviert IDs aus dem Speicher, bis er den letzten Wert erreicht und einen Zyklus neu startet.

Wenn Sie das JVM neu starten, gibt es für EL nur keine andere sichere Möglichkeit, einen neuen IDS-Pool zu preallocloclocloclocding und "diejenigen aus dem" vorherigen "Bereich, die nicht verwendet wurden (denken Sie an Multi-JVMs usw.), welche welche erklärt den "Sprung" von 2 bis 51 in Ihrem Beispiel.

Wenn Sie dies vermeiden möchten, wäre mein Vorschlag, zu einem zu wechseln IDENTITY Strategie, die von Derby unterstützt wird (ich glaube nicht, dass die Konfiguration des Tabellengenerators für eine Verwendung eins ist allocationSize von 1 wäre eine gute Idee).


Ich denke nicht, dass die Konfiguration des Tabellengenerators so eine gute Idee wäre, eine zu Allokationsverzinsung zu verwenden. Warum nicht?

Aufgrund des Auftrittsschlägers, wenn Sie für jeden Einsatz aus der Tabelle "Sequenz" lesen müssen. Andererseits ist 1) dies in Ihrem Fall 2) Dies ist die einzige Strategie, die es ermöglicht, wirklich sequentielle IDs zu erhalten.

Wenn Sie interessiert sind, sollten Sie diese weltweit mit dem konfigurieren können table-generator Element im XML -Deskriptor.

El entmutigt die Identitätsstrategie sehr, außer dass es anscheinend Minen gibt (weil Sie es warten müssen, bevor Sie den Wert lesen, etwas, das ich vielleicht irgendwo tun könnte).

Nun, ich kann für EL nicht bestätigen (ich werde das momentan nicht testen), aber Hibernate führt einen sofortigen Einsatz an persist Wenn Sie eine verwenden IDENTITY Strategie. Ich dachte, El würde sich auf die gleiche Weise verhalten. Aber ich könnte mich irren, das scheint von der Spezifikation nicht vorgeschrieben zu sein.

Verweise

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top