我班上有一个单向@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;
由于一个简单的错误,我终于找到了,因此我很难更新作业类型的数量。 但是,我不知道为什么会发生这种情况。
基本上,我所做的是,我有一个合并旧的和新的Job的方法,而不是从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);
}
我的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
从作业集中删除jobType并保留新作业时,不会发生任何事情 - &gt;这种关系仍然存在。
有人知道为什么吗?
注意:
这样做,对于没有@ManyToMany
关系的对象(也就是将旧对象的ID添加到新对象,而不是将新对象中的所有其他内容添加到旧对象),将尝试更新,当调用saveAndFlush
方法。
我正在使用: MariaDB 10.1.28 Spring Boot 1.5.4(带有相关的spring boot starter data jpa)
答案 0 :(得分:0)
底线是DB负责。让它为您创建所有ID。不要尝试在对象上设置ID。如果要插入新记录,可以使用空ID插入,数据库将分配ID,并且在插入课程之前您不会知道ID。但重要的是,如果你持续记录其中的HAS和ID(在POJO对象上),那么你需要确保它正在进行“更新”#39;操作不是&#39;插入&#39;或者你会遇到这个问题。