2017-11-25 224 views
0

我在我的类中的单向@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)

+0

行为对我来说是持久的,在逻辑上,您必须先删除旧记录(使用X id),以添加具有相同ID的新记录。也许尝试保存字段'整数临时'id值,删除旧记录,并尝试从'临时'添加新的ID – newOne

+0

这意味着两个查询。我解决问题的方式只使用一个查询。我只想知道为什么其他方法不起作用,并解释实际发生的情况。而且由于我无法找到任何地方,这个具体问题,我认为这也可以帮助其他人。 –

回答

0

底线是DB负责。让它为你创建所有的ID,不要尝试在对象上设置ID,如果你插入一个NEW记录,你可以插入wi th null ID和DB将分配ID,并且在插入课程之前您将不知道ID。但是重要的是,如果你持久保存一个记录,那就是HJ和ID(在POJO对象上),那么你需要确定它正在执行'update'操作而不是'insert',否则你会遇到这个问题。

+0

当调用'saveAndFlush'时,它会进行更新。所以如果我设置了一个ID,它会进行更新。如果我从数据库中获取记录,将其映射到对象,该对象还将包含一个ID。如果我更改了上述对象上的其他内容,并保持ID不变,则它会正确执行更新。但是在这里,我们正在讨论@ManyToMany关系,更新发生在父表中,但不会发生在关联表中。 –

+1

查找“级联”。如果没有明显的级联方式,您可能需要对两个表进行手动更新。我在@ManyToMany生锈而在此之前 https://stackoverflow.com/questions/946938/jpa-manytomany-writing-on-create-but-not-update 都做到了和谷歌这种“弹簧更新@manytomany“:P该搜索将获得大量命中。 – 2017-11-26 00:25:11

相关问题