有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将旧对象的id分配给新对象将把它作为重复的@ManyToMany插入

我在班上有一种单向的@ManyToMany关系,如下所示:

@ManyToMany(cascade = {
        CascadeType.MERGE,
        CascadeType.PERSIST
})
@JoinTable(
        name=TABLE_NAME_JOB_JOB_TYPE,
        joinColumns=@JoinColumn(name=COLUMN_JOB_ID, referencedColumnName = COLUMN_JOB_ID),
        inverseJoinColumns = @JoinColumn(name=COLUMN_JOB_TYPE_ID, referencedColumnName = COLUMN_JOB_TYPE_ID)
)
@Fetch(FetchMode.JOIN)
private Set<JobTypeModel> types;

我很难更新工作类型的数量,因为一个简单的错误,我最终发现了一份工作。 然而,我不知道为什么会发生这种情况

基本上,我所做的是,我有一个方法,将旧的和新的工作合并,而不是从newJob中获取所有内容,并添加到oldJob中,我获取oldJob的ID,并将其分配给newJob

所以,像这样:

public JobModel mergeAndUpdate(JobModel oldJob, JobModel newJob) {
    getLoggerService().debug(this.getClass().getSimpleName(), "mergeAndUpdate({oldJob}, {newJob})");
    //newJob.setId(oldJob.getId()); //If doing this, then it fails
    //Was trying to avoid doing this:
    oldJob.setX(newJob.getX());
    oldJob.setY(newJob.getY());
    oldJob.setZ(newJob.getZ());

    return getJobRepository().saveAndFlush(oldJob);
    //return getJobRepository().saveAndFlush(newJob);
}

My JobRepository是一个扩展org.springframework.data.jpa.repository.JpaRepository

执行此操作时,如果尝试持久化更新(添加一个或删除一个jobType),则会失败

当添加一个新的jobType时,它会告诉我在关联表JOB_JOB_TYPE中有一个重复的条目

Hibernate: insert into job_job_type (job_id, job_type_id) values (?, ?)
2017-11-26 00:02:28.202  WARN 74560 --- [p-nio-80-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1062, SQLState: 23000
2017-11-26 00:02:28.202 ERROR 74560 --- [p-nio-80-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper   : Duplicate entry '187-2' for key 'PRIMARY'
2017-11-26 00:02:28.203  INFO 74560 --- [p-nio-80-exec-6] o.h.e.j.b.internal.AbstractBatchImpl     : HHH000010: On release of batch it still contained JDBC statements

从作业集中删除作业类型并保留新作业时,不会发生任何事情->;这段关系将继续下去

有人知道为什么吗

注: 这样做,对于没有@ManyToMany关系的对象(即,将旧对象的ID添加到新对象中,而不是将新对象中的所有其他内容添加到旧对象中),将在调用saveAndFlush方法时尝试更新

我正在使用: MariaDB 10.1.28 Spring Boot 1.5.4(带有相关的Spring Boot starter数据jpa)


共 (1) 个答案

  1. # 1 楼答案

    底线是DB负责。让它为你创建所有ID。不要试图在对象上设置ID。如果要插入一条新记录,可以使用空ID插入,DB将分配ID,当然,直到插入之后,您才知道ID。但重要的是,如果要持久化一条记录(在POJO对象上),并且记录上有ID,则需要确保它正在执行“更新”操作,而不是“插入”,否则会出现此问题