web-dev-qa-db-fra.com

Représentation différente de l'UUID dans Java Hibernate et SQL Server

J'essaie de mapper une colonne UUID de POJO à une colonne de table SQL Server à l'aide d'Hibernate.

Les annotations sont appliquées comme suit:

@Id
@GeneratedValue
@Column(name = "Id", columnDefinition = "uniqueidentifier") 
public UUID getId(){ ... }

Cependant, il semble y avoir un problème d’endianisme entre le mappage Java Hibernate et le serveur SQL.

Par exemple, dans mon application Java, j'ai des identifiants représentés par:

4375CF8E-DEF5-43F6-92F3-074D34A4CE35
ADE3DAF8-A62B-4CE2-9D8C-B4E4A54E3DA1

alors que dans SQL Server, ceux-ci sont représentés par:

8ECF7543-F5DE-F643-92F3-074D34A4CE35
F8DAE3AD-2BA6-E24C-9D8C-B4E4A54E3DA1

Est-il possible d'avoir la même représentation des deux côtés?

Veuillez noter que uniqueidentifier est utilisé uniquement pour avoir un identifiant typé uniqueidentifier dans le serveur SQL au lieu du type binary; le même problème existe lorsque uniqueidentifier est supprimé de l'annotation (le problème peut être observé en convertissant binary = uniqueidentifier).

10
Sayan Pal

Vous devez spécifier la @Type(type = "uuid-char"), voir aussi Problèmes de mappage de l’UUID dans JPA/hibernate .

Vous pouvez également utiliser un champ String pour l'ID en Java tout en conservant uniqueidentifier dans SQL Server.

8
Markus Ratzer

Les bases de données Microsoft utilisent des GUID. C'est l'implémentation par Microsoft du standard UUID.

Ceci étant dit, vous devriez utiliser le générateur de guid.

@Id
@GenericGenerator(name = "generator", strategy = "guid", parameters = {})
@GeneratedValue(generator = "generator")
public String getId() {
    return id;
}

guid utilise une chaîne GUID générée par la base de données sur MS SQL Server et MySQL.

En outre, avez-vous défini SQLServer2012Dialect? Cela pourrait également résoudre certains problèmes futurs.

2
Nico Van Belle

Avec SQL Server, vous devez utiliser guid strategy pour votre générateur:

@GeneratedValue(generator = "my-uid")
@GenericGenerator(name = "my-uid", strategy = "guid")
@Id
private UUID uuid;

https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/mapping.html

Java utilise le générateur UUID en version 4, comment pouvez-vous voir ici:

4375CF8E-DEF5 - 4 3F6-92F3-074D34A4CE35

ADE3DAF8-A62B - 4 CE2-9D8C-B4E4A54E3DA1

1
Łukasz Rzeszotarski