Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Spring Data: Detached Entity passed to persist Fehler
ich bin mal wieder auf ein Problem gestoßen, womit ich gar nicht klar kommen. Ich habe ein BackupPoint Model der sozusagen zwei Verzeichnise als String abspeichert und letztes Document, Registration und Appointment.
Beim Erstellen des BackupPoint Object setze ich ein in der DB existierendes Document, Registration und Appointment Object mit. Und beim Speichern des BackupPoint Objects bekomme ich folgende Meldung:
Code:
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: de.dc.fx.model.calendar.Appointment; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: de.dc.fx.model.calendar.Appointment
Was hat das zu bedeuten?
An sich sollen die referenzierten Objekte nicht mehr gespeichert werden, d.h. CascadeType Merge und Refresh reicht in dem Sinne oder?
Es sollen jeweils nur die Ids der Objekte in das BackupPoint gespeichert werden, d.h. wenn ich ganz dumme mache könnte ich es auch so ohne Referenzierung machen
Code:
@Entity
public class BackupPoint {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "BACKUP_POINT_ID", nullable = false, columnDefinition = "BIGINT")
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String sourcePath;
@Column(nullable = false)
private String targetPath;
@Column(nullable = false)
private int documentId;
@Column(nullable = false)
private int RegistrationId;
@Column(nullable = false)
private int appointmentId;
}
Aber das ist auch nicht wirklich das wahre. Was ist da mein Denkfehler und wie kann man es schöner machen?
Ich würde mal annehmen, dass das genau das bedeutet, was dort steht. Dein BackupPoint referenziert ein Appointment-Objekt, das sich zum Zeitpunkt des persist im DETACHED-Zustand befindet.
Ohne mir jetzt die Spezifikation anzusehen, finde ich das strange, weil persist für appointment ja nicht kaskadierend ausgeführt wird. Hier hätte ich die MapsId-Annotation in Verdacht, die mit an Sicherheit grenzender Wahrscheinlichkeit falsch an der Stelle ist.
Vielen Dank euch beiden. Ich habe die MapsId Annotation rausgemacht und jeweils die Referenzen in die Documents, Registrations und Appointments ergänzt. Danach geht's.
Ja, ich könnte mich jetzt nicht erinnern, an welcher Stelle wir bidirektionale Beziehungen verwenden würden. Vielmehr bilden wir Aggregate von der Wurzel aus mit unidirektionalen Beziehungen ab, während Beziehungen zwischen Aggregaten nur durch IDs dargestellt werden.