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

时间:2017-01-14 15:33:26

标签: java sql-server hibernate

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

注释应用如下:

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

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

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

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

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

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

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

请注意,uniqueidentifier仅用于在SQL服务器中输入uniqueidentifier ID,而不是binary类型;从注释中移除uniqueidentifier时存在同样的问题(通过将binary转换为uniqueidentifier来观察问题。)

3 个答案:

答案 0 :(得分:12)

您需要指定@Type(type = "uuid-char"),另请参阅Problems mapping UUID in JPA/hibernate

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

答案 1 :(得分:3)

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

话虽这么说,你应该使用guid生成器。

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

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

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

答案 2 :(得分:1)

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

@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在版本4中使用UUID生成器,您在这里可以看到:

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

ADE3DAF8-A62B-的 4 CE2-9D8C-B4E4A54E3DA1