使用 Spring JPA 在 H2 和 Sql Server 中持久化的 Java UUID

Posted

技术标签:

【中文标题】使用 Spring JPA 在 H2 和 Sql Server 中持久化的 Java UUID【英文标题】:Java UUID persisting in H2 and Sql Server with Spring JPA 【发布时间】:2020-07-06 17:27:33 【问题描述】:

假设我需要在数据库中保留一些数据,其中一列是 request_id,这是我的应用程序创建的随机 uuid。

首先,我在 DDL 创建 H2 和 SQL Server 数据库的语句中应该使用什么类型?我将 H2 用于本地,将 sql server 用于生产。

CREATE TABLE REQUESTS_DETAILS
(
    REQUEST_ID --what should be the type for H2 and SQLServer? 
    NAME NVARCHAR(20)   NOT NULL,
);

其次,使用Spring JPA Entity对应的java类型是什么?

【问题讨论】:

对于 H2(和 Postgres),它是 UUID。使用 SQL Server,我认为是 uniqueidentifier @chrylis-cautiouslyoptimistic- 这适用于 JPA 吗? JPA Entity 上的哪种类型可以处理 dbs 之间的差异 只需使用java.util.UUID。 Hibernate 至少可以毫无问题地将其映射到本机数据库类型。 @chrylis-cautiouslyoptimistic- 实际上并没有。当 H2 上的 java.util.UUID 是直接实体属性时,Hibernate 似乎不一致地将其映射到 UUID,但当它是嵌入式属性时,它会映射到 BINARY。 【参考方案1】:

我最近几天经历了这一切。看看here 和here。

这个 uuid 会成为你的主键吗?

对于数据类型,看业务对uuid的数据类型有什么需求。我建议您至少阅读一次this。

总结一下,根据我目前的理解,使用数据类型作为字符串作为你的 uuid 并选择 uuid4。如果您计划使用 Spring JPA/Hibernate,请选择 Long 类型作为主键/外键。这样您就可以轻松维护您的密钥并轻松索引它们,而不是在索引字符串类型 uuid 时搞乱。

如果您正在寻找像 uuid 这样的唯一标识符(就像我一样),请在 String 类型的实体中寻找一个单独的字段并生成 uuid4 数据类型并将其视为 String。建议使用字符串,因为您始终可以毫不费力地将它们从一个数据库移植到另一个数据库。始终考虑在不同数据库(MSSQL/Oracle/DB2/Postgres 等)之间迁移数据这一事实。

现在,回到使用 UUID,您总是可以这样做:

@NotEmpty
@Column(name = "useruuid")
@GenericGenerator(name = "uuid", strategy = "uuid4")
private String useruuid;

要生成 UUID,您可以简单地使用:

UUID.randomUUID() 

UUID.randomUUID().toString();

查看here 和here 我最近发布的示例项目。

【讨论】:

以上是关于使用 Spring JPA 在 H2 和 Sql Server 中持久化的 Java UUID的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot、JPA、Hibernate 和 H2 DB 测试 - 序列不起作用 - 意外的代码路径”;SQL 语句:调用 seq_my_jobs [50000-193] 的下一个值

SpringBoot+Spring Data JPA整合H2数据库

SpringBoot+Spring Data JPA整合H2数据库

Spring Boot JPA 和 H2 记录未持久化

如何使用Spring Data JPA在H2数据库中保存数据

通过 Spring Boot JPA + Postgresql + H2 执行间隔