通常我将我的UUID以字符串形式存储到数据库中.在Spring Boot2.x中,我使用@Type(type = "org.hibernate.type.UUIDCharType")来表示UUID.不知怎么的,在Spring Boot3.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'

}

推荐答案

如果您阅读了Hibernate6的迁移指南,您会发现我们不再使用字符串类型的名称来标识类型.这要好得多.

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

@Id
private UUID id;

原则上会运作得很好.

您甚至可以使用:

@Id @GeneratedValue
private UUID id;

如果您想要生成UUID.

但是,请注意,默认情况下,如果数据库具有这种类型,则映射到类型为UUID的列.如果确实需要映射到VARCHAR列,请使用:

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

或者:

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

视口味而定.

Java相关问答推荐

是否需要关闭Executors返回的执行器.newVirtualThreadPerTaskExecutor()?

如何在Javascript中设置文本区域圆角的样式

如何以干净的方式访问深度嵌套的对象S属性?

R.id.main给我一个红色错误,无法解析MainActivity.java中的符号main

使用REST客户端和对象映射器从字符串反序列化Json

由于我在Main方法中关闭了 scanner ,但在该方法中创建了一个新的 scanner ,因此出现了错误

Spring Data JPA慢慢地创建了太多非活动会话

测试容器无法加载类路径初始化脚本

把一条整型短裤和两条短裤装成一条长的

Java ArrayList的整数和数组的泛型

尽管通过中断请求线程死亡,但线程仍将继续存在

如何使用Criteria Builder处理一对多关系中的空值?

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

有没有办法知道在合并中执行了什么操作?

在ECLIPSE上的M1 Pro上运行JavaFX的问题

使用原子整数的共享计数器并发增量

如何组合Mono和Flux

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?

如何在 Visual Studio 代码中快速生成构造函数和 getter、setter?

JavaFX AnchorPane zoom