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)
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
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. –