Java Hibernate和SQL Server中UUID的不同表示
我正在尝试使用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 Server中具有uniqueidentifier
类型的id而不是binary
类型; 从注释中删除uniqueidentifier
时存在同样的问题(通过将binary
转换为uniqueidentifier
可以观察到该问题)。
您需要指定@Type(type = "uuid-char")
,另请参阅在JPA / hibernate中映射UUID的问题 。
或者,您可以在Java中使用String
字段作为id,并且仍然在SQL Server中保留uniqueidentifier
。
Microsoft数据库使用GUID。 这是微软对UUID标准的实施。
话虽这么说,你应该使用guid发生器。
@Id @GenericGenerator(name = "generator", strategy = "guid", parameters = {}) @GeneratedValue(generator = "generator") public String getId() { return id; }
guid
在MS SQL Server和MySQL上使用数据库生成的GUID字符串。
另外,你设置了SQLServer2012Dialect吗? 这也可以解决一些未来的问题。
使用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 4F6-92F3-074D34A4CE35
ADE3DAF8-A62B- 4 CE2-9D8C-B4E4A54E3DA1