2012-04-06 14 views
86

ich durch Id-Erzeugungsabschnitt des Hibernate-Referenzhandbuch und „Java Persistence mit Hibernate“ werdeWie die ID Generation Strategie wählen, wenn JPA und Hibernate

Es gibt durchaus ein paar Optionen zur Verfügung mit Hibernate und JPA kombiniert .

Ich suchte nach einer weiteren Dokumentation zur Auswahl der spezifischen ID-Generation Strategie.

Ich suche auch nach Kipppunkten.

Zum Beispiel wird erwartet, dass die Strategie von hilo die Konkurrenz reduziert. Ich gehe davon aus, dass es einen Kompromiss mit dieser Wahl geben muss.

Ich möchte über die Kompromisse informiert werden.

Gibt es Literatur?

Antwort

79

Die API Doc sind sehr klar zu diesem Thema.

Alle Generatoren implementieren die Schnittstelle org.hibernate.id.IdentifierGenerator. Dies ist eine sehr einfache Schnittstelle. Einige Anwendungen können ihre eigenen spezialisierten Implementierungen bereitstellen, Hibernate bietet jedoch eine Reihe von integrierten Implementierungen. Die Kontextnamen für die Einbau-Generatoren sind wie folgt:

Inkrement

Identifikatoren vom Typ erzeugt lange, kurze oder int, die nur einmalig sind, wenn kein anderer Prozess werden Daten in der gleichen Tabelle eingefügt wird. Verwenden Sie nicht in einem Cluster.

Identität

unterstützt Identitätsspalten in DB2, MySQL, MS SQL Server, Sybase und HypersonicSQL. Der zurückgegebene Bezeichner ist vom Typ long, short oder int.

Sequenz

verwendet eine Sequenz in DB2, PostgreSQL, Oracle, SAP DB, McKoi oder ein Generator in Interbase. Die zurückgegebenen Identifikator ist vom Typ lange, kurze oder int

hilo

verwendet einen Hallo/lo-Algorithmus, um effizient Identifikatoren vom Typ zu erzeugen lang, kurz oder int, gegeben eine Tabelle und die Spalte (standardmäßig hibernate_unique_key und next_hi) als Quelle von Hi-Werten. Der hi/lo-Algorithmus generiert Kennungen, die nur für eine bestimmte Datenbank eindeutig sind.

seqhilo

verwendet ein hallo/lo Algorithmus effizient Identifikatoren vom Typ zu erzeugen lang, kurz oder int, eine benannte Datenbanksequenz gegeben.

UUID

verwendet einen 128-Bit-UUID Algorithmus Identifikatoren vom Typ String zu erzeugen, die in einem Netzwerk eindeutig sind (die IP-Adresse verwendet wird). Die UUID ist als eine Zeichenfolge von 32 hexadezimalen Ziffern in der Länge codiert.

guid

verwendet eine Datenbank generierte GUID-Zeichenfolge auf MS SQL Server und MySQL.

nativen

wählt Identität, Sequenz oder hilo abhängig von den Fähigkeiten der zugrunde liegenden Datenbank.

zugewiesen

ermöglicht die Anwendung eine Kennung, bevor speichern zu dem Objekt zuweisen() aufgerufen wird. Dies ist die Standardstrategie, wenn kein Element angegeben ist.

wählen

einen Primärschlüssel abruft, durch einen Datenbank-Trigger zugeordnet ist, indem die Zeile durch einen eindeutigen Schlüssel auswählt und den Primärschlüsselwert abruft.

Fremd

verwendet die Kennung eines anderen zugeordneten Objekts. Es wird normalerweise in Verbindung mit einer Primärschlüsselzuordnung verwendet.

Sequenz-Identität

eine spezielle Sequenz Erzeugungsstrategie, die eine Datenbank-Sequenz für die tatsächliche Wert Generation nutzt, sondern kombiniert diese mit JDBC3 getGeneratedKeys den erzeugten Kennungswert als Teil der Einsatz der Ausführung der Anweisung zurückzukehren. Diese Strategie wird nur für Oracle 10g-Treiber unterstützt, die auf JDK 1.4 abzielen. Kommentare zu diesen INSERT-Anweisungen sind aufgrund eines Fehlers in den Oracle-Treibern deaktiviert.

Wenn Sie eine einfache Anwendung mit nicht viel gleichzeitigen Benutzern erstellen, können Sie für Schritt gehen, Identität, hilo etc .. Diese sind einfach zu konfigurieren und nicht viel Codierung innerhalb der db benötigten.

Sie sollten Sequenz oder guid je nach Ihrer Datenbank wählen. Diese sind sicher und besser, weil die id Generation innerhalb der Datenbank passieren wird.

Update: Kürzlich hatten wir ein Problem mit idendity, wo primitive Typ (int) wurde dies mit Warapper Typ (Integer) stattdessen behoben.

+0

Vielen Dank für Ihre Antwort. Ich habe die Dokumente bereits angesehen. Ich suche jedoch, warum Leute etwas wie hilo und seqhilo verwenden würden. Wann treffen wir diese Entscheidung? Was sind die Anwendungsfälle für Select. –

+0

Wenn etwas so einfach wie Sequenz oder Guid ist, was kann ein Entwickler verlangen, andere Wege zu wählen. –

+1

Ich habe meine Antwort aktualisiert. Tatsächlich ** Inkrement, Identität, hilo ** etc .. sind einfacher. aber sie sind nicht für Unternehmensanwendungen geeignet. Es ist kein Problem, alle Optionen beizubehalten, aber stellen Sie sicher, dass Sie das für Sie am besten geeignete verwenden! – ManuPK

19


Vorhin ich einen ausführlichen Artikel über Hibernate Keygeneratoren schrieb: http://blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html

Wahl der richtigen Generator ist eine komplizierte Aufgabe, aber es ist wichtig zu versuchen, und es richtig so schnell wie möglich zu bekommen - ein spätes Migration könnte ein Albtraum sein.

Ein wenig off topic, aber eine gute Chance, einen Punkt, der in der Regel Schlüssel zwischen Anwendungen (über API) zu teilen ist in der Regel übersehen. Persönlich bevorzuge ich immer Ersatzschlüssel und wenn ich meine Objekte mit anderen Systemen kommunizieren muss, stelle ich meinen Schlüssel nicht zur Verfügung (obwohl es ein Ersatz ist) - ich benutze einen zusätzlichen "externen Schlüssel".Als Berater habe ich mehr als einmal 'großartige' Systemintegrationen mit Objektschlüsseln gesehen (der 'es ist da, lass uns einfach' Ansatz verwenden), nur um ein oder zwei Jahre später zu finden, dass eine Seite Probleme mit dem Schlüsselbereich oder etwas davon hat die Art, die eine tiefe Migration auf dem System erfordert, die ihre internen Schlüssel exponiert. Das Freilegen Ihres Schlüssels bedeutet, dass ein elementarer Aspekt Ihres Codes externen Einschränkungen ausgesetzt ist, denen Sie nicht wirklich ausgesetzt sein sollten.

32

Grundsätzlich haben Sie zwei große Möglichkeiten:

  • Sie die Kennung erzeugen kann sich selbst, in dem Fall, dass Sie eine assigned identifier verwenden können.
  • Sie können die @GeneratedValue Annotation verwenden und Hibernate wird die ID für Sie zuweisen.

Für die generierten Kennungen haben Sie zwei Möglichkeiten:

Für numerische Kennungen you have three options:

  • IDENTITY
  • FOLGE
  • TABLE

IDENTITY nur eine gute Wahl ist, wenn Sie nicht Sequenz (z MySQL), weil it disables JDBC batch updates verwenden können.

SEQUENCE ist die bevorzugte Option, besonders wenn sie mit einem Bezeichneroptimierer wie pooled or pooled-lo verwendet wird.

TABLE is to be avoided at any cost da es eine separate Transaktion verwendet, um die Kennung und Sperren auf Zeilenebene abzurufen, die schlecht skaliert.

2

Ich finde diese Vorlesung sehr wertvoll https://vimeo.com/190275665, in Punkt 3 fasst es diese Generatoren zusammen und gibt auch einige Performance-Analyse und Leitlinie eins, wenn Sie jedes verwenden.

+1

Dieses Video sieht sehr vertraut aus. –

+1

@VladMihalcea Ja, es ist hahahahah;) Sehr gute Arbeit! – Adelin

Verwandte Themen