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;
java
hibernate
annotations
uuid
Martin
quelle
quelle
@Id @GeneratedValue private java.util.UUID id;
Arbeit in Hibernate 5+. Siehe Dokumentation .strategy = "uuid"
undstrategy = "uuid2"
?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.
quelle
system-uuid
ist nur ein Name für den Generator, siehe Zeile 3. In Zeile 2 wird darauf verwiesen.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".
quelle
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
id
Spalte mit dem TypBINARY(16)
in MySQL oder in anderen SQL-Implementierungen.quelle
@Type(type="uuid-char")
Anmerkung hinzufügen , um dieVARCHAR(36)
Spalte zu verwenden@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; }
quelle
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:
BINARY(16)
java.lang.String
verbraucht die Instanz mehr Speicher alsjava.util.UUID
: 112 Byte für UUID als Zeichenfolge gegenüber 32 Byte (dh zwei Longs + Obj-Header) fürUUID
.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
quelle
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ärenjava.util.UUID
Art.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;
quelle
@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.
quelle