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;

Antworten:



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.


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".


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.


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;
}

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


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;

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.