【问题标题】:Different representation of UUID in Java Hibernate and SQL ServerJava Hibernate 和 SQL Server 中 UUID 的不同表示
【发布时间】:2017-05-29 19:59:41
【问题描述】:

我正在尝试使用 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,而不是输入 binary;将uniqueidentifier从注解中移除时也会出现同样的问题(通过将binary转换为uniqueidentifier可以观察到问题)。

【问题讨论】:

标签: java sql-server hibernate


【解决方案1】:

除了@Column(name="...", columnDefinition = "uniqueidentifier"),您还需要指定@Type(type = "uuid-char"),另见Problems mapping UUID in JPA/hibernate

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

【讨论】:

  • 最初我认为这不正确,但已经确认它有效,如果您使用 @Column(columnDefinition = "uniqueidentifier") @Type(type = "uuid-char") 它可以确保列类型被创建为“uniqueidentifier”,但是当读取/写入数据库时​​,UUID 顺序是预期的(即,当您在 SSMS 中查看该字段时,它看起来与您在 UUID 上使用 .toString() 时相同)。
【解决方案2】:

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吗?这也可能解决一些未来的问题。

【讨论】:

  • 我尝试了解决方案,但没有成功,我的数据库有一个 GUID,但是当我从表中获取数据时,它会生成不同的 UUID。任何形式的帮助表示赞赏。
【解决方案3】:

对于 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-43F6-92F3-074D34A4CE35

ADE3DAF8-A62B-4CE2-9D8C-B4E4A54E3DA1

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 2010-10-20
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多