Spring 数据 r2dbc 更新

问题描述

我有一个带有非自动生成的主键的表,它基本上是一个外键。 因此,使用文档中所述的 withId 方法

https://docs.spring.io/spring-data/r2dbc/docs/1.2.3/reference/html/#reference

创建新实例工作正常。但是,在不选择的情况下更新实例会产生重复错误。它不会将其视为更新并尝试插入记录。

表格:

CREATE TABLE `project_contact` (
  `project_id` bigint NOT NULL,`first_name` varchar(25) DEFAULT NULL,`last_name` varchar(25) DEFAULT NULL,`email` varchar(45) NOT NULL,PRIMARY KEY (`client_id`),CONSTRAINT `prj_project_id` FOREIGN KEY (`project_id`) REFERENCES `project` (`project_id`)
)

模型类,

public class ProjectContact {

    @Id
    private final Long id;
    private final long projectId;
    private final String firstName;
    private final String lastName;
    private final String email;

    public static ProjectContact of(long projectId,String firstName,String lastName,String email) {
        return new ProjectContact(null,projectId,firstName,lastName,email);
    }

    
    public ProjectContact(Long id,long projectId,String email) {
        super();
        this.id = id;
        this.projectId = projectId;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public ProjectContact withId(Long id) {
        return new ProjectContact(id,this.projectId,this.firstName,this.lastName,this.email);
    }
}

这里,projectId 是一个外键,因此使用 withId。

创建新实例工作正常。

Project prj = Project.of(....);

projectRespository.save(prj);

在没有选择的情况下更新实例,由于未通过代码设置 id 会引发重复错误

 Project prj = Project.of(....);
    
    projectRespository.save(prj);

错误:-

Caused by: io.r2dbc.spi.R2dbcDataIntegrityViolationException: Duplicate entry '15' for key 'project_contact.PRIMARY'
    at dev.miku.r2dbc.MysqL.ExceptionFactory.createException(ExceptionFactory.java:94) ~[r2dbc-MysqL-0.8.2.RELEASE.jar:0.8.2.RELEASE]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ⇢ sql "INSERT INTO project_contact (project_id,first_name,last_name,email) VALUES (?,?,?)" [DatabaseClient]
Stack trace:
        at dev.miku.r2dbc.MysqL.ExceptionFactory.createException(ExceptionFactory.java:94) ~[r2dbc-MysqL-0.8.2.RELEASE.jar:0.8.2.RELEASE]
        at dev.miku.r2dbc.MysqL.TextQueryHandler.accept(QueryFlow.java:317) ~[r2dbc-MysqL-0.8.2.RELEASE.jar:0.8.2.RELEASE]
        at dev.miku.r2dbc.MysqL.TextQueryHandler.accept(QueryFlow.java:292) ~[r2dbc-MysqL-0.8.2.RELEASE.jar:0.8.2.RELEASE]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)