web-dev-qa-db-fra.com

Utiliser Hibernate UUIDGenerator via des annotations

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;
65
Martin

Ce devrait être uuid2:

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

Voir 5.1.2.2.1. Divers générateurs supplémentaires .

93
axtavt

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.

15
CSchulz

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

10
kervin

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.

4
senjin.hajrulahovic

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

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:

  • la taille consommée est supérieure à BINARY(16)
  • après l'hydratation, l'instance 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

1
stokito
@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.

0
Sumit

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;
0
JavierFuentes