wake-up-neo.com

Auswahl der ID-Generierungsstrategie bei Verwendung von JPA und Ruhezustand

Ich habe den Abschnitt zur ID-Generierung im Referenzhandbuch für den Ruhezustand und "Java-Persistenz mit Ruhezustand" durchgearbeitet.

In Kombination mit Hibernate und JPA stehen einige Optionen zur Verfügung.

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

Ich bin auch auf der Suche nach Wendepunkten.

Beispielsweise wird von der Hilo-Strategie erwartet, dass sie Konflikte verringert. Ich gehe davon aus, dass mit dieser Wahl ein Kompromiss verbunden sein muss.

Ich möchte über die Kompromisse aufgeklärt werden.

Gibt es Literatur?

101
user1317764

Die API Doc machen dies sehr deutlich.

Alle Generatoren implementieren das Interface org.hibernate.id.IdentifierGenerator. Dies ist eine sehr einfache Schnittstelle. Einige Anwendungen können ihre eigenen spezialisierten Implementierungen bereitstellen. Hibernate bietet jedoch eine Reihe integrierter Implementierungen. Die Verknüpfungsnamen für die integrierten Generatoren lauten wie folgt:

Inkrement

generiert Bezeichner vom Typ long, short oder int, die nur dann eindeutig sind, wenn kein anderer Prozess Daten in dieselbe Tabelle einfügt. Nicht in einem Cluster verwenden.

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 einen Generator in Interbase. Der zurückgegebene Bezeichner ist vom Typ long, short oder int

hilo

verwendet einen Hi/Lo-Algorithmus zum effizienten Generieren von Bezeichnern des Typs long, short oder int, wenn eine Tabelle und eine Spalte (standardmäßig hibernate_unique_key bzw. next_hi) als Quelle für Hi-Werte angegeben werden. Der Hi/Lo-Algorithmus generiert Kennungen, die nur für eine bestimmte Datenbank eindeutig sind.

seqhilo

verwendet einen Hi/Lo-Algorithmus zum effizienten Generieren von Bezeichnern des Typs long, short oder int bei einer angegebenen Datenbanksequenz.

uuid

verwendet einen 128-Bit-UUID-Algorithmus, um innerhalb eines Netzwerks eindeutige Bezeichner vom Typ string zu generieren (die IP-Adresse wird verwendet). Die UUID wird als Zeichenfolge mit 32 hexadezimalen Ziffern codiert.

guid

verwendet eine datenbankgenerierte GUID Zeichenfolge unter MS SQL Server und MySQL.

native

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

zugewiesen

ermöglicht es der Anwendung, dem Objekt einen Bezeichner zuzuweisen, bevor save () aufgerufen wird. Dies ist die Standardstrategie, wenn kein Element angegeben ist.

wählen Sie

ruft einen Primärschlüssel ab, der von einem Datenbank-Trigger zugewiesen wurde, indem die Zeile mit einem eindeutigen Schlüssel ausgewählt und der Primärschlüsselwert abgerufen wird.

ausländisch

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

Sequenzidentität

eine spezielle Strategie zur Generierung von Sequenzen, die eine Datenbanksequenz zur Generierung des tatsächlichen Werts verwendet, diese jedoch mit JDBC3 getGeneratedKeys kombiniert, um den generierten Bezeichnerwert als Teil der Ausführung der Einfügeanweisung zurückzugeben. Diese Strategie wird nur von Oracle 10g-Treibern unterstützt, die für JDK 1.4 vorgesehen sind. Kommentare zu diesen Einfügeanweisungen sind aufgrund eines Fehlers in den Oracle-Treibern deaktiviert.

Wenn Sie eine einfache Anwendung mit nicht vielen gleichzeitigen Benutzern erstellen, können Sie Inkrement, Identität, Hilo usw. auswählen. Diese sind einfach zu konfigurieren und durchzuführen brauche nicht viel codierung in der db.

Sie sollten Reihenfolge oder GUID je nach Ihrer Datenbank wählen. Diese sind sicher und besser, da die Generierung von id in der Datenbank erfolgt.

Update: Vor kurzem hatten wir ein Problem mit der Identität, bei dem primitiven Typ (int) dies durch die Verwendung von Warapper-Typ (Integer) behoben wurde.

89
ManuPK

Grundsätzlich haben Sie zwei Hauptoptionen:

  • Sie können den Bezeichner selbst generieren. In diesem Fall können Sie einen zugewiesenen Bezeichner verwenden.
  • Du kannst den ... benutzen @GeneratedValue annotation und Hibernate weisen Ihnen die ID zu.

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

  • ID-IDs .
  • Numerische Bezeichner.

Für numerische Bezeichner Sie haben drei Möglichkeiten :

  • IDENTITÄT
  • SEQUENZ
  • TABELLE

IDENTITY ist nur dann eine gute Wahl, wenn Sie SEQUENCE nicht verwenden können (z. B. MySQL), da JDBC-Batch-Updates werden deaktiviert .

SEQUENCE ist die bevorzugte Option, insbesondere wenn sie mit einem Identifier Optimizer wie pooled oder pooled-lo verwendet wird.

TABLE ist um jeden Preis zu vermeiden da es eine separate Transaktion verwendet, um die Kennung und die Sperren auf Zeilenebene abzurufen, die schlecht skaliert werden.

44
Vlad Mihalcea


Vor einiger Zeit habe ich einen ausführlichen Artikel über Hibernate-Schlüsselgeneratoren geschrieben: http://blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html

Die Auswahl des richtigen Generators ist eine komplizierte Aufgabe, aber es ist wichtig, dass Sie versuchen, sie so schnell wie möglich richtig zu machen - eine späte Migration kann ein Albtraum sein.

Ein wenig falsches Thema, aber eine gute Gelegenheit, einen Punkt anzusprechen, der normalerweise übersehen wird: das Teilen von Schlüsseln zwischen Anwendungen (über API). Persönlich bevorzuge ich immer Ersatzschlüssel und wenn ich meine Objekte mit anderen Systemen kommunizieren muss, lege ich meinen Schlüssel nicht offen (obwohl es sich um einen Ersatzschlüssel handelt) - ich verwende einen zusätzlichen „externen Schlüssel“. Als Berater habe ich mehr als einmal "großartige" Systemintegrationen mit Objektschlüsseln gesehen (der Ansatz "es ist da, lasst es uns einfach anwenden"), nur um ein oder zwei Jahre später herauszufinden, dass eine Seite Probleme mit dem Schlüsselbereich oder etwas anderem hat Die Art, die eine tiefe Migration auf dem System erfordert, die ihre internen Schlüssel offenlegt. Das Offenlegen Ihres Schlüssels bedeutet, dass Sie einen grundlegenden Aspekt Ihres Codes keinen externen Einschränkungen aussetzen, denen Sie eigentlich nicht ausgesetzt sein sollten.

20
Eyal Lupu

Ich finde diese Vorlesung sehr wertvoll https://vimeo.com/190275665 , in Punkt 3 werden diese Generatoren zusammengefasst und es werden auch einige Leistungsanalysen und Richtlinien für die jeweilige Verwendung angegeben.

2
Adelin