2012-08-03 8 views
11

Ich habe Probleme damit, eine genaue Erklärung von @GeneratedValue und den verschiedenen Strategien zu finden, die sich darauf beziehen, was aus der Sicht einer Datenbank geschieht.Hibernate: Überblick über die Funktionsweise von @GeneratedValue

Wird die Datenbank immer abgefragt und der letzte verfügbare Wert zurückgegeben? Was passiert, wenn 2 verschiedene Prozesse (unterschiedliche Hibernate-Apps) gleichzeitig auf dieselbe Tabelle zugreifen, speziell mit numerischen Werten und Sequenzen

Antwort

20

Ich gehe davon aus, dass Sie sich auf den JPA @GeneratedValue beziehen.

Die Annotation @GeneratedValue teilt dem ORM mit, wie der Wert dieses Feldes ermittelt werden soll.

Zum Beispiel:

@Id 
@GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ") 
@Column(name="CUST_ID") 
public Long getId() { return id; } 

Example 2: 

@Id 
@GeneratedValue(strategy=TABLE, generator="CUST_GEN") 
@Column(name="CUST_ID") 
Long id; 

Der Schlüssel, was zu verstehen ist, dass ein generierter Wert eine Strategie und die Strategie des erzeugten Wertes bestimmt, was geschieht. Im obigen Beispiel bedeutet die SEQUENCE-Generierungsstrategie, dass das ORM die Datenbank nach einem neuen Wert für die Sequenz fragt, wenn ein Objekt zum ersten Mal gespeichert wird. Das zweite Beispiel spezifiziert eine Tabellengenerierungsstrategie, was bedeutet, dass das ORM eine Zeile in einer Tabelle konsultieren wird, um den Wert einer ID zu bestimmen. In Beispiel 2 werden die Details der verwendeten Tabelle nicht angezeigt, da sie einen Generator namens "CUST_GEN" referenziert.

Typische Generatoren, denen Sie begegnen werden.

  • Identität - Nach einem Einsatz stellt die automatischen incerement Spalte für den Wert des Elements
  • Sequenz - der Wert stammt aus einer db-Sequenz
  • Tabelle - der Wert kommt aus einer anderen Tabelle in der Datenbank
  • auto - eine der oben genannten Pick auf der Basis der Datenbanktyp
  • UUID - erzeugen eine UUID vor, einen Einsatz zu tun

Es possib ist le, um kundenspezifischen Generator zu entwickeln. Die Interaktion mit der Datenbank hängt von der Erzeugungsstrategie ab.

+0

Danke für die Adressierung aus Sicht der db – javaNoober

+0

die am besten geeignet ist IDENTITY oder SEQUENCE –

-3

, wenn Sie in Ihrer Entity-Bean-Klasse verwenden

@Id 
@GeneratedValue 
@Column(name="CUST_ID") 
public Long getId() { return id; } 

In diesem Fall wird Hibernate bestimmen, welche Art von Primärschlüssel generiert und es hängt davon ab, welche Datenbank Sie verwenden.

Standardmäßig wird die Annotation @Id automatisch die am besten geeignete zu verwendende Primärschlüsselgenerierungsstrategie bestimmen. Sie können diese jedoch überschreiben, indem Sie die Annotation @GeneratedValue übernehmen, die zwei Parameter Strategie und Generator enthält, auf die hier nicht eingegangen wird. Lassen Sie uns also nur die Standard-Schlüsselgenerierungsstrategie als Standard verwenden. Wenn Sie Hibernate bestimmen lassen, welcher Generatortyp verwendet werden soll, ist Ihr Code zwischen verschiedenen Datenbanken übertragbar.

+0

Die Frage war zu erklären, "wie @GeneratedValue funktioniert", die Sie vollständig übersprungen. –

Verwandte Themen