2016-06-02 12 views
0

Ich verwende den Tabellengenerator, um Primärschlüssel für alle Tabellen zu generieren. Kürzlich erhielt ich eine Anforderung, die ich brauche, um die inkrementierte ID programmatisch zu erhalten, ohne die Entität in der Datenbank zu behalten. Ich glaube, es kann erreicht werden, indem interne interne Hibernate API aufgerufen wird. Wie auch immer wissen, wie man die inkrementierte ID programmatisch mit Hibernate bekommt?Hibernate wird programmatisch inkrementiert ID

+0

http://stackoverflow.com/questions/11788483/hibernate-rundown-on-how-generatedvalue-works – ares

+0

Aber es erklärt nicht auf Wie bekomme ich die ID programmatisch? – kenn3th

+0

Sie müssen lediglich die Annotation "@ GeneratedValue" über Ihr ID-Feld hinzufügen, und der Ruhezustand wählt automatisch die am besten geeignete Methode zum Generieren von IDs aus. – ares

Antwort

0

Ich schaute in NHibernat Code (sicherlich funktioniert es für Hibernate das gleiche). Sie können den ID-Generator aufrufen, aber das wird nicht viel helfen, da die generierte ID beim Speichern eines Objekts nicht verwendet wird.

Dies ist etwas, das konzeptionell nicht funktioniert. Sie können nicht veranlassen, dass ein System automatisch IDs generiert und diese außerhalb der Speicherprozedur zur selben Zeit generiert.

Dies sind die Optionen, die mir in den Sinn kommen:

  • Verwenden ID-Generator „zugewiesen“ und erzeugen die IDs selbst. Nur so können Sie eine ID zuordnen, die vor dem Speichern definiert wurde. (Beachten Sie, dass es nicht trivial ist, eindeutige Zahlen in einem System von gleichzeitigen Transaktionen zu generieren.) Es ist nicht sehr komfortabel für Ihren Code, wie Sie sehen werden.
  • Fragen Sie die Anforderung. Sobald ein Objekt für den Benutzer identifiziert wurde, sollte es nicht persistent sein?
  • Ziehen Sie in Betracht, die sichtbare ID vom Primärschlüssel zu trennen. Es kann ein Overkill sein, zu IDs im System zu haben, nur um vor dem anderen definiert zu haben, aber ansonsten entkoppelt es Ihre Primärschlüssel von Benutzerdaten. Sie können aus technischen Gründen zu anderen ID-Generatoren wechseln, ohne die Anforderungen zu erfüllen. (Ähnlich wie bei dem ersten Punkt, aber nicht mit Primärschlüssel Messing mehr.)
+0

Ich muss dies implementieren, weil ich eine laufende Nummer brauche, um den Code zu konstruieren, der später in der Datenbank bleiben wird. z.B. US-ABC-1000001 und ich möchte dafür keine Sequenznummer erstellen. – kenn3th

+1

Wenn Sie es wie beschrieben haben möchten, müssen Sie entweder einen zuweisbaren Primärschlüssel haben oder den "US-ABC-1000001" -Teil vom Primärschlüssel trennen. In beiden Fällen müssen Sie die Sequenznummer selbst verwalten. Sie können wahrscheinlich Hibernate ID-Generatoren dafür verwenden. ID-Generatoren haben normalerweise nicht viel Code und Sie könnten es auch selbst implementieren. –

Verwandte Themen