Ich habe ein umfangreiches JPA-Modell, das ausschließlich unidirektionale @ManyToOne-Beziehungen vom Kind zum Elternteil verwendet, zum Beispiel so.
Code: Select all
public class Child {
@ManyToOne(optional = false)
@JoinColumn(name = "parent")
private Parent parent
}
Es gibt zig Millionen solcher Beziehungen in einer ziemlich verworrenen Hierarchie, die zu einer Entität an der Wurzel führt. Wir haben kaskadierende Datenbanklöschvorgänge eingerichtet, sodass es nur erforderlich ist, die oberste Entität zu löschen, wenn wir Dinge löschen möchten. Dies war wesentlich effizienter als die Durchführung in JPA. Früher hat das gut funktioniert, aber mit Hibernate 6 stoßen wir auf ein Problem.
Wenn ich zu irgendeinem Zeitpunkt in einem Test eine untergeordnete-Entität geladen habe, sagen wir, und dann versuche, eine übergeordnete-Entität zu löschen, erhalte ich eine Ausnahme wie diese
Code: Select all
org.hibernate.TransientObjectException: persistent instance references an unsaved transient instance of 'Parent'
Ich kann dem Stapel entnehmen, dass diese Ausnahme über CascadingAction.CHECK_ON_FLUSH ausgelöst wird. Aus dem Debug kann ich auch ersehen, dass die Beziehung, die dies auslöst, vom untergeordneten zum übergeordneten Element besteht. Dies ist möglicherweise nicht unangemessen, um zu überprüfen, ob die geladenen Entitäten keine freien Referenzen haben. Dies wird jedoch offensichtlich der Fall sein, da wir Dinge nicht mithilfe von JPA löschen, sondern über kaskadierende Löschvorgänge in der Datenbank.
Ich möchte die kaskadierenden Löschvorgänge in der Datenbank wirklich nicht in JPA replizieren müssen, und wie bereits erwähnt ist es erheblich langsamer als kaskadierende Löschvorgänge in der Datenbank.
Gibt es eine Möglichkeit, diese Prüfung zu deaktivieren oder diese Beziehungen stattdessen als kaskadierende Löschvorgänge in der Datenbank zu kennzeichnen, damit Hibernate weiß, dass dies möglich ist? Entfernen Sie einfach die Entitäten sicher?
Hinweis: Ich verwende Spring Boot.