2017-11-25 455 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

相關問題