Verwenden des UUIDGenerator im Ruhezustand über Anmerkungen

77

Ich benutze meine UUID wie folgt:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;

Ich erhalte jedoch eine intelligente Warnung für den Ruhezustand:

Verwenden von org.hibernate.id.UUIDHexGenerator, das keine IETF RFC 4122-kompatiblen UUID-Werte generiert; Verwenden Sie stattdessen org.hibernate.id.UUIDGenerator

Ich möchte also zu wechseln org.hibernate.id.UUIDGenerator. Jetzt ist meine Frage, wie ich es dem Generator von Hibernate mitteilen soll. Ich habe gesehen, dass ein Typ es als "Ruhezustand" verwendet hat - also habe ich es versucht, aber mit negativem Ergebnis:

@Id
@GeneratedValue(generator = "hibernate-uuid")
@GenericGenerator(name = "hibernate-uuid", strategy = "hibernate-uuid")
@Column(name = "uuid", unique = true)
private String uuid;
Martin
quelle

Antworten:

107

Es sollte sein uuid2 :

...
@GenericGenerator(name = "uuid", strategy = "uuid2")
...

Siehe 5.1.2.2.1. Verschiedene zusätzliche Generatoren .

axtavt
quelle
4
Dies gilt auch für 4.1 . Beachten Sie außerdem, dass java.util.UUID.randomUUID () verwendet wird.
CorayThan
23
Eine einfache @Id @GeneratedValue private java.util.UUID id;Arbeit in Hibernate 5+. Siehe Dokumentation .
Natan Cox
Was ist der Unterschied zwischen strategy = "uuid"und strategy = "uuid2"?
Olivier Boissé
17

HibernateDoc sagt, dass Sie Folgendes verwenden können:

@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;

Ich hoffe, Sie verwenden Hibernate 3.5.

CSchulz
quelle
system-uuidist nur ein Name für den Generator, siehe Zeile 3. In Zeile 2 wird darauf verwiesen.
CSchulz
11

Versuchen...

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(name = "uuid", columnDefinition = "BINARY(16)")
public UUID getId()
{
    return id;
}

public void setId(UUID i)
{
    id = i;
}

Beachten Sie die "uuid2" im Gegensatz zu "uuid".

Kervin
quelle
8

Wie @natan in einem Kommentar hervorhob, ist der folgende Code ausreichend, wenn Sie Hibernate 5 verwenden:

@Id 
@GeneratedValue
private java.util.UUID id;

Definieren Sie die idSpalte mit dem Typ BINARY(16)in MySQL oder in anderen SQL-Implementierungen.

senjin.hajrulahovic
quelle
oder Sie können auch eine @Type(type="uuid-char")Anmerkung hinzufügen , um die VARCHAR(36)Spalte zu verwenden
Sergey Ponomarev
4

Unbekannter Id.generator: Ruhezustand-UUID

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "id", unique = true)
public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}
Ahmad R. Nazemi
quelle
4

Dies verwendet UUID v4 und die automatisch generierte UUID wird wie gewohnt in der Spalte gespeichert varchar(36):

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(length = 36)
private String uuid;

Dies sollte einige Auswirkungen auf die Leistung haben:

  • verbrauchte Größe ist mehr als BINARY(16)
  • Nach der Hydratation java.lang.Stringverbraucht die Instanz mehr Speicher als java.util.UUID: 112 Byte für UUID als Zeichenfolge gegenüber 32 Byte (dh zwei Longs + Obj-Header) für UUID.

Es ist jedoch viel einfacher, mit einer UUID mit Zeichenfolgen zu arbeiten - es ist einfacher, Abfragen zu schreiben, und Sie können den Inhalt der Tabelle sehen.

Getestet im Ruhezustand 5.3

Sergey Ponomarev
quelle
1

Mit der aktuellen Version 5.4.2 Hibernate,

wenn Sie einen wollen die Menschen lesbaren varchar (36) Feld in der Datenbanktabelle,
sondern auch einen Serializable UUID - Datentyp in Ihrer Java - Klasse,
können Sie verwenden @Type(type = "uuid-char") zur gleichen Zeit Sie Ihr Feld - Mitglied erklären java.util.UUIDArt.

Beachten Sie, dass @Column(length = 36)es wichtig ist, die Feldlänge in MySQL von 255 auf 36 zu reduzieren.

Beachten Sie, dass Sie @Type(type = "pg-uuid")stattdessen PostgreSQL verwenden sollten .

import org.hibernate.annotations.Type
import java.util.UUID
import javax.persistence.Column
import javax.persistence.GeneratedValue
import javax.persistence.Id

@Id @GeneratedValue
@Type(type = "uuid-char") @Column(length = 36)
private UUID id;
JavierFuentes
quelle
das hat endlich bei mir geklappt danke! :) (mit UUID in Java, Varchar (36) in SQL und Spring Boot 2.1.1)
Zoltán Umlauf
obwohl ich festgestellt habe, dass dies eine UUID generiert, auch wenn die angegebene Entität bereits eine aus Code hat
Zoltán Umlauf
0
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "UUID_ID")
public String getId(){
return id;
}

Dies ist der richtige Weg, um Anmerkungen für UUID-Generatoren in Hibernate 5.0.11.FINAL zu verwenden.

Hinweis: Die IT ist veraltet.

Sumit
quelle