我在我的类中的单向@ManyToMany
关系,具体如下:分配旧的对象,以新对象的ID将将它插入重复@ManyToMany
@ManyToMany(cascade = {
CascadeType.MERGE,
CascadeType.PERSIST
})
@JoinTable(
name=TABLE_NAME_JOB_JOB_TYPE,
[email protected](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);
}
我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并保留新作业时,什么都不会发生 - >关系仍然会保留。
有人知道为什么吗?这样做,对于没有@ManyToMany
关系的对象(即将旧对象的ID添加到新对象中,而不是将新对象中的所有其他对象添加到旧对象,都将尝试更新,调用saveAndFlush
方法时
我使用: MariaDB的28年1月10日 春季启动1.5.4(与相关的弹簧引导启动数据JPA)
行为对我来说是持久的,在逻辑上,您必须先删除旧记录(使用X id),以添加具有相同ID的新记录。也许尝试保存字段'整数临时'id值,删除旧记录,并尝试从'临时'添加新的ID – newOne
这意味着两个查询。我解决问题的方式只使用一个查询。我只想知道为什么其他方法不起作用,并解释实际发生的情况。而且由于我无法找到任何地方,这个具体问题,我认为这也可以帮助其他人。 –