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

velaa5lx  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(185)

通常我将UUID作为字符串存储到数据库中。在Sping Boot 2.x中,我使用@Type(type = "org.hibernate.type.UUIDCharType")对UUID进行decoreate。在Sping Boot 3.x中,它不再工作。它告诉我Cannot resolve method 'type'
我知道雅加达有一些变化,但我不知道这对我来说是否是一个问题。
我的实体:

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Type;

import java.util.Set;
import java.util.UUID;

@Data
@Entity
@Table(name = "werkstatt")
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WerkstattEntity {

    @Id
    @Column(columnDefinition = "VARCHAR(255)")
    @Type(type = "org.hibernate.type.UUIDCharType")
    private UUID id;
}

我的毕业部:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'io.projectreactor:reactor-test'
    testImplementation 'org.springframework.security:spring-security-test'
    

    // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api
    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'

    // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'

    // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-jackson
    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

    implementation 'org.mapstruct:mapstruct:1.5.5.Final'

    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'

}
sd2nnvve

sd2nnvve1#

如果你阅读Hibernate 6的迁移指南,你会发现我们不再使用字符串类型的名称来标识类型。这样好多了
但更好的是,您不再需要定制的@Type注解来持久化UUID。所以:

@Id
private UUID id;

原则上会很好。
您甚至可以用途:

@Id @GeneratedValue
private UUID id;

如果你想生成UUID
但是,请注意,默认情况下,如果数据库具有UUID类型,则此Map将Map到该类型的列。如果你真的需要Map到VARCHAR列,用途:

@Id @GeneratedValue
@JdbcTypeCode(Types.VARCHAR)
private UUID id;

或:

@Id @GeneratedValue
@JdbcType(VarcharJdbcType.class)
private UUID id;

取决于口味。

gywdnpxw

gywdnpxw2#

我知道雅加达有一些变化,但我不知道这对我来说是否是一个问题。
可能是吧Jakarta Persistence API 3.1现在支持java.util.UUID类型(here和这里)。
在Maven(mvn dependency:tree)中绘制最新版本Spring-Boot(3.0.6)的依赖关系树,您可以看到它使用org.hibernate.orm:hibernate-core:jar:6.1.7.Final-这是JPA 3.1的compatible
尝试从WerkstattEntity实体中删除@Column(columnDefinition = "VARCHAR(255)")@Type(type = "org.hibernate.type.UUIDCharType")注解。
但要谨慎:在Apache Derby数据库上,java.util.UUID类型被转换为char(16) for bit data

相关问题