2017-11-25 1 views
0

Ich habe eine unidirektionale @ManyToMany Beziehung in meiner Klasse, wie folgt:Zuweisen von ID des alten Objekts neuen Objekt wird es als Duplikat @ManyToMany einfügen

@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; 

Ich hatte eine harte Zeit, die Anzahl der Auftragsarten zu aktualisieren, Ein Job hatte, wegen eines einfachen Fehlers, den ich endlich gefunden habe. Ich kann jedoch nicht sagen, warum das passiert.

Im Grunde genommen hatte ich eine Methode, die den alten und den neuen Job zusammenführte, und anstatt alles von newJob zu nehmen und zu oldJob hinzuzufügen, nehme ich die ID von oldJob und weise sie newJob zu .

So, wie folgt aus:

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); 
} 

Meine JobRepository ist eine Schnittstelle, die diese org.springframework.data.jpa.repository.JpaRepository

Wenn tun erstreckt, wenn ein Update zu anhalten versuchen, (entweder mit einem hinzugefügt oder ein Jobtype entfernt), es würde scheitern.

Beim Hinzufügen eines neuen jobType würde es mir sagen, dass ich einen doppelten Eintrag in der Zuordnungstabelle JOB_JOB_TYPE habe.

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 

Wenn ein Jobtype zu entfernen, aus dem Job Satz und den neuen Job persistierenden, würde nichts passieren -> würde die Beziehung noch bleiben.

Weiß jemand warum?

Hinweis: Dadurch wird für Objekte, die keine @ManyToMany-Beziehung haben (aka. Das Hinzufügen der ID des alten Objekts zum neuen Objekt, statt das Hinzufügen aller anderen Elemente aus dem neuen Objekt zum alten Objekt) Update, wenn die saveAndFlush Methode aufrufen

ich verwende. MariaDB 10.1.28 Frühlings-Boot 1.5.4 (mit den zugehörigen Feder Boot Starter Daten JPA)

+0

Behavioral persistent für mich ist logisch, müssen Sie zuerst alten Datensatz löschen (mit X-ID), um einen neuen Datensatz mit der gleichen ID hinzuzufügen. Vielleicht versuchen Sie speichern, Feld "Integer temp" ID-Wert, löschen alten Datensatz, und versuchen, neue mit ID aus 'temp' – newOne

+0

Das bedeutet zwei Abfragen. Die Art, wie ich das Problem gelöst habe, verwendet nur eine Abfrage. Ich will nur wissen, warum das anders herum nicht funktioniert, und eine Erklärung dafür, was tatsächlich passiert. Und da ich diese spezifische Frage nirgends finden konnte, dachte ich, dass es auch in dieser Situation anderen helfen könnte. –

Antwort

0

Unterm Strich ist die DB ist zuständig Lassen Sie alle IDs für Sie erstellen Versuchen Sie nicht, IDs für Objekte festzulegen Wenn Sie einen NEUEN Datensatz einfügen, können Sie wi einfügen Die Null-ID und die DB werden die ID zuweisen, und Sie werden die ID erst nach dem Einfügen natürlich kennen. Wenn Sie jedoch einen Datensatz mit HAS und ID (auf dem POJO-Objekt) beibehalten, müssen Sie sicher sein, dass er eine 'Aktualisierungs' -Operation ausführt und nicht eine 'Einfügung' oder Sie werden dieses Problem bekommen.

+0

Wenn 'saveAndFlush' aufgerufen wird, wird ein Update durchgeführt. Wenn ich also eine ID einstelle, wird es ein Update machen. Wenn ich einen Datensatz aus der Datenbank abrufe und ihn einem Objekt zuordne, enthält das Objekt auch eine ID. Wenn ich andere Sachen auf dem besagten Objekt ändere und die ID intakt lasse, macht es das Update korrekt. Aber hier sprechen wir über die Beziehung @ManyToMany, und das Update findet in der übergeordneten Tabelle statt, wird aber nicht in der Zuordnungstabelle passieren. –

+1

Suche "Kaskadierung". Wenn es keine offensichtliche Möglichkeit zum Kaskadieren gibt, müssen Sie möglicherweise manuelle Aktualisierungen für beide Tabellen vornehmen.Ich bin auf @ManyToMany rostig, aber habe es schon getan https://stackoverflow.com/questions/946938/jpa-manytomany-writing-on-create-but-not-update und google diese "Aktualisierung mit Feder @manytomany ": P Diese Suche wird viele Treffer bekommen. –

Verwandte Themen