Bestehen OneToOne Beziehung mit SpringData JPA
Habe ich die nächsten beiden Einheiten mit einem OneToOne relation zwischen Ihnen:
@Entity
@Table(name = "tasks")
public class Task {
@OneToOne(mappedBy = "task", cascade = CascadeType.PERSIST)
private Tracker tracker;
/* More code */
}
@Entity
@Table(name = "trackers")
public class Tracker {
@OneToOne
@JoinColumn(name = "trk_task", unique = true)
private Task task;
/* More code */
}
Ich versuche, diesen code ausführen:
Task task = taskService.findDispatchableTask();
if (task != null) {
Tracker tracker = trackerService.findIdleTracker();
if (tracker != null) {
task.setTracker(tracker);
task.setStatus(TaskStatus.DISPATCHED);
taskService.save(task);
}
}
Aber ich bekomme diese Fehlermeldung:
ERROR org.hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: non-transient entity has a null id
Kann ich "lösen" es ändern mein code:
Task task = taskService.findDispatchableTask();
if (task != null) {
Tracker tracker = trackerService.findIdleTracker();
if (tracker != null) {
tracker.setTask(task);
trackerService.save(tracker);
task.setTracker(tracker);
task.setStatus(TaskStatus.DISPATCHED);
taskService.save(task);
}
}
Meine Frage ist, Was ist die richtige Art und Weise zu bestehen und OneToOne relation? In meinem code, Warum muss ich dann speichern Sie beide Teile der Beziehung, damit es funktioniert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier gehen wir wieder.
Jede bidirektionale Assoziation hat zwei Seiten : der Eigentümer-Seite und der umgekehrten Seite. Die inverse Seite ist die eine, die die
mappedBy
Attribut. Der Besitzer der Seite ist das andere. JPA/Hibernate kümmert sich nur um den Besitzer der Seite. Also, wenn Sie nur initialisieren der umgekehrten Seite, der association nicht beibehaltene.Es ist eine gute übung, im Allgemeinen, zu initialisieren beiden Seiten des Vereins. Erstens, weil es macht Sie sicher, dass der Besitzer der Seite initialisiert wird, und zweitens, weil es macht die Graphen von Entitäten kohärenten, für Ihre eigenen gut.
Beachten Sie auch, dass, wenn Sie arbeiten innerhalb einer Transaktion (und Sie sollten), werden alle Personen zurückgegeben, die durch Ihre Anfragen angehängt sind Entitäten. Die änderungen an den Entitäten werden automatisch dauerhaft gespeichert werden, wenn die Transaktion ein commit ausgeführt wird (oder bevor). Es besteht keine Notwendigkeit zum speichern der Entitäten explizit wie du tust.
save()
.