使用 JPA/Hibernate 将 UUID 作为字符串保存在数据库中

gen*_*mer 2 java database hibernate jpa spring-boot

通常我将 UUID\xc2\xb4s 作为字符串存储到数据库中。在 Spring Boot 2.x 中,我曾经用@Type(type = "org.hibernate.type.UUIDCharType"). 不知何故,在 Spring Boot 3.x 中它不再起作用了。它告诉我Cannot resolve method 'type'

\n

我知道雅加达发生了一些变化,但我不知道这对我来说是否是一个问题。

\n

我的实体:

\n
import jakarta.persistence.*;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotations.Type;\n\nimport java.util.Set;\nimport java.util.UUID;\n\n@Data\n@Entity\n@Table(name = "werkstatt")\n@AllArgsConstructor\n@NoArgsConstructor\n@Builder\npublic class WerkstattEntity {\n\n    @Id\n    @Column(columnDefinition = "VARCHAR(255)")\n    @Type(type = "org.hibernate.type.UUIDCharType")\n    private UUID id;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的毕业部门:

\n
dependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-actuator'\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'\n    implementation 'org.springframework.boot:spring-boot-starter-security'\n    implementation 'org.springframework.boot:spring-boot-starter-web'\n    implementation 'org.springframework.boot:spring-boot-starter-webflux'\n    compileOnly 'org.projectlombok:lombok'\n    developmentOnly 'org.springframework.boot:spring-boot-devtools'\n    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'\n    annotationProcessor 'org.projectlombok:lombok'\n    testImplementation 'org.springframework.boot:spring-boot-starter-test'\n    testImplementation 'io.projectreactor:reactor-test'\n    testImplementation 'org.springframework.security:spring-security-test'\n    \n\n    // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api\n    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'\n\n    // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl\n    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'\n\n    // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-jackson\n    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'\n\n    implementation 'org.mapstruct:mapstruct:1.5.5.Final'\n\n    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Gav*_*ing 12

如果您阅读 Hibernate 6 的迁移指南,您会发现,我们不再使用字符串类型的名称来标识类型。哪个更好。

但更好的是,您不再需要自定义@Type注释来持久化UUID。所以:

@Id
private UUID id;
Run Code Online (Sandbox Code Playgroud)

原则上可以正常工作。

您甚至可以使用:

@Id @GeneratedValue
private UUID id;
Run Code Online (Sandbox Code Playgroud)

如果你想UUID生成。

但请注意,默认情况下,UUID如果数据库具有此类类型,则这会映射到该类型的列。如果您确实需要映射到VARCHAR列,请使用:

@Id @GeneratedValue
@JdbcTypeCode(Types.VARCHAR)
private UUID id;
Run Code Online (Sandbox Code Playgroud)

或者:

@Id @GeneratedValue
@JdbcType(VarcharJdbcType.class)
private UUID id;
Run Code Online (Sandbox Code Playgroud)

取决于口味。