Java Spring R2DBC:如果id为零,则保存新实体

Java Spring R2DBC:如果id为零,则保存新实体,java,spring,kotlin,spring-data-r2dbc,r2dbc,Java,Spring,Kotlin,Spring Data R2dbc,R2dbc,我正在从传统的JPA代码库迁移,并面临一个问题,即通过将id设置为零无法保存新实体 以下是我的模式(PostreSQL): 创建表格我的用户( id串行主键, 名称VARCHAR(255)不为空 ); 在JPA中,我可以将id设置为0,它将被视为一个新实体。将自动分配一个新id。 但是,在R2DBC中,新实体总是以id=0的形式保存,这是不可能的 我知道,我可以使用Integer或Long进行设置,并将它们设置为null,但我使用的是Kotlin,我想使id不可为null。否则我必须做大量不必

我正在从传统的JPA代码库迁移,并面临一个问题,即通过将id设置为零无法保存新实体

以下是我的模式(PostreSQL):

创建表格我的用户(
id串行主键,
名称VARCHAR(255)不为空
);
在JPA中,我可以将id设置为
0
,它将被视为一个新实体。将自动分配一个新id。 但是,在R2DBC中,新实体总是以id=0的形式保存,这是不可能的

我知道,我可以使用
Integer
Long
进行设置,并将它们设置为
null
,但我使用的是Kotlin,我想使
id
不可为null。否则我必须做大量不必要的空检查

userRepo.save(用户(0,“新用户”)//works
userRepo.save(用户(0,“另一个新用户”)//错误,相同id(但在JPA中工作)
@Table(“我的用户”)
数据类用户(@Id-var-Id:Int=0,
变量名称:String=“”)

这个问题似乎将在Spring Boot 2.4中解决


这个问题似乎将在Spring Boot 2.4中解决


为什么JPA会将
0
视为新实体?为什么需要对主键进行空检查?你不应该在代码中触及它。@Kayaman,因为我必须在Kotlin代码中声明id为null,比如
@id var id:Int?
。每次我访问id时,Kotlin编译器都会强制我检查它是否为null。在JPA中,如果id是基本的,那么零被认为是新的,但是为什么要访问
id
?这是一个数据库主键。你的应用程序知道新实体为空,现有实体为非空,但它不应该分配或访问它,因为我处理的是外键。e、 g.
postRepo.save(Post(0,user.id,“一些文本”))
。我正在访问
user.id
似乎是因为两者之间的处理不同。为什么JPA会将
0
视为一个新实体?为什么需要对主键进行空检查?你不应该在代码中触及它。@Kayaman,因为我必须在Kotlin代码中声明id为null,比如
@id var id:Int?
。每次我访问id时,Kotlin编译器都会强制我检查它是否为null。在JPA中,如果id是基本的,那么零被认为是新的,但是为什么要访问
id
?这是一个数据库主键。你的应用程序知道新实体为空,现有实体为非空,但它不应该分配或访问它,因为我处理的是外键。e、 g.
postRepo.save(Post(0,user.id,“一些文本”))
。我正在访问
user.id
,这似乎是因为它们之间的处理方式不同。