J'utilise mon uuid comme suit:
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;
mais je reçois un avertissement intelligent d'Hibernate:
En utilisant org.hibernate.id.UUIDHexGenerator qui ne génère pas IETF RFC 4122 valeurs UUID conformes; envisager d'utiliser org.hibernate.id.UUIDGenerator à la place
Donc, je veux passer à org.hibernate.id.UUIDGenerator
, maintenant ma question est: comment devrais-je le dire au générateur d'Hibernate. J'ai vu un gars l'utiliser comme un "hibernate-uuid" - c'est donc ce que j'ai essayé, mais avec un résultat négatif:
@Id
@GeneratedValue(generator = "hibernate-uuid")
@GenericGenerator(name = "hibernate-uuid", strategy = "hibernate-uuid")
@Column(name = "uuid", unique = true)
private String uuid;
Ce devrait être uuid2
:
...
@GenericGenerator(name = "uuid", strategy = "uuid2")
...
HibernateDoc indique que vous pouvez utiliser les éléments suivants:
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;
J'espère que vous utilisez Hibernate 3.5.
Essayer...
@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;
}
Notez le "uuid2" par opposition à "uuid".
Comme @natan l'a souligné dans un commentaire, si vous utilisez Hibernate 5, le code ci-dessous est suffisant:
@Id
@GeneratedValue
private Java.util.UUID id;
Définissez la colonne id
avec le type BINARY(16)
dans MySQL ou son équivalent dans d'autres implémentations SQL.
Inconnu Id.generator: hibernate-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;
}
Ceci utilisera UUID v4 et l'uuid généré automatiquement sera stocké dans la colonne comme d'habitude varchar(36)
:
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(length = 36)
private String uuid;
Cela devrait avoir un impact sur les performances:
BINARY(16)
Java.lang.String
consomme plus de mémoire que Java.util.UUID
Mais il est beaucoup plus facile de travailler avec un UUID à chaîne - il est plus facile d'écrire des requêtes et vous pouvez voir le contenu de la table.
Testé sur Hibernate 5.3
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "UUID_ID")
public String getId(){
return id;
}
C’est la bonne façon d’utiliser l’annotation pour les générateurs de uuid dans Hibernate 5.0.11.FINAL.
Remarque: IT est obsolète.
Avec la version 5.4.2 actuelle d'Hibernate,
si vous voulez un champ Human-Readable varchar (36) dans la table de la base de données,
mais aussi un type de données Serializable UUIDdans votre classe Java,
vous pouvez utiliser @Type(type = "uuid-char")
en même temps vous déclarez votre membre de champ avec le type Java.util.UUID
.
Notez que @Column(length = 36)
est important pour réduire de 255 à 36 la longueur du champ dans MySQL.
Notez qu'avec PostgreSQL, vous devriez utiliser @Type(type = "pg-uuid")
à la place.
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;