UUID中间没有连字符。

4

受这里提供的建议所启发 - JPA实体类在使用2个@GeneratedValue字段时报错,我的问题相反 - 如何生成不带破折号的UUID

我正在使用H2数据库,并且在我的模型中有以下内容:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "useruuid")
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid4")
    private UUID userUUID; 

在我的控制器中,它是这样的:

    @PostConstruct
    private void postConstruct() {
        AppUser appUser = new AppUser(1l, UUID.randomUUID());
        appUserJPARepository.save(appUser);
    }

现在,当我的 Spring Boot 应用程序启动时,我的 H2 DB 控制台会显示以下内容:

ID      USERUUID  
1       25b9b7f391d94825b349866fe9a9077c
问题:如何在数据库中获得连字符?这样我的UUID在数据库中将为-25b9b7f3-91d9-4825-b349-866fe9a9077c

我尝试了将@GenericGenerator(name = "uuid4", strategy = "uuid4")的uuid(1)更改为uuid5,但是得到了相同的结果。这是怎么回事?我做错了什么或者应该做什么才能在数据库中获得连字符?任何有关此问题的帮助、相关信息/链接将不胜感激。


列类型是什么?破折号只是一种美观的特征,因此如果您将UUID存储为字节数组,则不会得到任何内容。如果您将其存储为文本/varchar,则会获得破折号,但这是一种相当低效的存储UUID的方式。 - Svetlin Zarev
我已经阅读了这篇文章 - https://tomharrisonjr.com/uuid-or-guid-as-primary-keys-be-careful-7b2aa3dcb439。@Svetlin,你有什么建议?我的意思是,我应该如何使用它?我一点头绪也没有。 - Ajay Kumar
8
H2有一个专门的UUID类型,它是一个128位的值。破折号纯粹是装饰性的,看起来H2的控制台没有为您添加它们。由于您将UUID用作不透明的随机外部唯一标识符,因此您不需要它带有破折号,当Java UUID被查看时,它会有破折号,因为Java UUID类会为显示添加破折号。 - Simon G.
2
另外 - 由于您出于安全原因使用UUID,请确保使用“uuid4”而不是其他类型。您可以通过检查位来确定UUID的类型。类型1显示记录创建的位置和时间。类型4是随机的,因此更加安全。其他类型需要额外的信息,这些信息可能是可预测的,从而产生您试图避免的可预测ID。 - Simon G.
好的,明白了 Simon。感谢您宝贵的建议和帮助。 - Ajay Kumar
1个回答

0

你可以直接删除

@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid4")

代码将会是这样的

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "useruuid")
@GeneratedValue
private UUID userUUID; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接