Java Hibernate和SQL Server中UUID的不同表示

Say*_*Pal 14 java sql-server hibernate

我正在尝试UUID使用Hibernate将POJO中的列映射到SQL Server表列.

注释应用如下:

@Id
@GeneratedValue
@Column(name = "Id", columnDefinition = "uniqueidentifier") 
public UUID getId(){ ... }
Run Code Online (Sandbox Code Playgroud)

但是,似乎Java Hibernate映射和SQL服务器之间存在一些字节序问题.

例如,在我的Java应用程序中,我将id表示为:

4375CF8E-DEF5-43F6-92F3-074D34A4CE35
ADE3DAF8-A62B-4CE2-9D8C-B4E4A54E3DA1
Run Code Online (Sandbox Code Playgroud)

而在SQL Server中,这些表示为:

8ECF7543-F5DE-F643-92F3-074D34A4CE35
F8DAE3AD-2BA6-E24C-9D8C-B4E4A54E3DA1
Run Code Online (Sandbox Code Playgroud)

有没有办法在双方都有相同的代表?

请注意,uniqueidentifier它仅用于uniqueidentifier在SQL Server中具有类型ID而不是类型binary; 当存在同样的问题uniqueidentifier,从注释移除(可观察到该问题通过转换binaryuniqueidentifier).

Mar*_*zer 17

您需要指定@Type(type = "uuid-char"),另请参阅JPA/hibernate中映射UUID的问题.

或者,您可以String在Java中使用id作为id 的字段,并保留uniqueidentifier在SQL Server中.


Nic*_*lle 5

Microsoft 数据库使用 GUID。它是 Microsoft 对 UUID 标准的实现。

话虽如此,您应该使用 guid 生成器。

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

guid 在 MS SQL Server 和 MySQL 上使用数据库生成的 GUID 字符串。

另外,您是否设置了 SQLServer2012Dialect?这也可能解决一些未来的问题。


Łuk*_*ski 3

对于 SQL Server,您应该为生成器使用guid策略:

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

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

Java 在版本 4 中使用 UUID 生成器,您如何在这里看到:

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

ADE3DAF8-A62B -4 CE2-9D8C-B4E4A54E3DA1