JPA / Hibernate remove entity funktioniert manchmal nicht
Ich habe den folgenden code, der funktioniert normalerweise auch:
public void delete(T object)
{
EntityManager em = getPersistence().createEntityManager();
EntityTransaction et = em.getTransaction();
try
{
et.begin();
object = em.find(object.getClass(), object.getId());
em.remove(object);
em.flush();
et.commit();
}
catch(Exception e)
{
error("Unable to delete " + object.toString() + ": there are references to it.");
}
finally
{
if (et.isActive()) et.rollback();
em.close();
}
}
Für viele meiner entity-Klassen das funktioniert. Doch für zwei von Ihnen bedeutet es nichts, es löst keine Ausnahmen aus, und es löscht nicht das Objekt. Das Protokoll aus dem Ruhezustand zeigt, dass hibernate führt eine Reihe von select-Abfragen sind, aber es gar nicht versuchen, auszuführen, zu löschen.
Hab ich schon versucht, Anregungen in anderen ähnlichen Fragen hier und hier, aber ohne Erfolg (gut, letzteres schlägt @Transactional
die ich nicht verwenden kann, aber ich eingeschlossen, werden die Anweisungen zwischen begin()
und commit()
statt).
Ich kann nicht scheinen zu finden, was diese beiden Klassen haben mehr (oder weniger) als die anderen. Sie verwenden @PrimaryKeyJoinColumn
genau wie fast alle anderen Elemente, die ich habe, haben Sie @OneToMany
und @ManyToOne
wie ohters. Um ehrlich zu sein, Sie haben eine @OneToOne(optional = false)
Feld verweist auf eine andere Klasse ist und dass andere Personen nicht haben, aber ich würde nicht gehen durch den Aufwand der änderung, dass (und folglich ändern des Datenbank-Schemas), es sei denn, Sie sagen mir, es könnte einen Grund dafür.
Ist @OneToOne
verantwortlich? Oder ist mein code löschen verbuggt?
InformationsquelleAutor der Frage Lucio Crusca | 2013-06-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie Vereine in diesem Graphen, dass eine Kaskade bestehen zurück zu der Sache gelöscht werden? Wenn ja, ist die JPA spec Staaten klar, dass der Anbieter zu stornieren, löschen Sie in einem solchen Fall. Ist dies der Fall, Hibernate schreibt eine log-Anweisung aus, nämlich "un-scheduling-Einheit Löschung [...]". Sie konnte sehen, dass durch das aktivieren der Ablaufverfolgung auf der
org.hibernate.event.internal.DefaultPersistEventListener
logger.Wenn dies der Fall ist, werden Sie brauchen, um aufzuräumen solche Assoziationen wie von JPA-Spezifikation.
InformationsquelleAutor der Antwort Steve Ebersole
Austausch der
cascade = CascadeType.ALL
durchorphanRemoval = true
im@OneToMany
Verein gibt das erwartete Ergebnis: Die child-Datensätze werden korrekt entfernt werden, ohne die Notwendigkeit, löschen Sie den übergeordneten Datensatz.Schade, dass die Fehlermeldung nicht angemeldet mehr klar.
InformationsquelleAutor der Antwort Arthur Nederlof
Ich habe das gleiche Problem, wenn folgende Dinge zusammenkommen.
Einige der Untergeordneten Entität mit Verweis auf die Muttergesellschaft. Es ist legacy code.
Untergeordneten Entität wird in die Sitzung geladen Rahmen und dann entfernt wird aus der Tabelle ohne JPA-Benachrichtigung innerhalb der Transaktion (gespeicherte Prozedur, native sql)
Dann Eltern können nicht gelöscht werden. Keine Löschung, keine Ausnahme, nur "un-Zeitplan löschen" - Nachricht im TRACE-Protokoll.
Lösung: ich entfernte cascade-Attribut. Es war ein wenig schwierig für mich zu finden, die in der Untergeordneten Entität Blöcke Parent löschen. Auch verstehe ich nicht warum Kind-Kaskade betrifft, wenn ich entfernen Übergeordnete Entität.
InformationsquelleAutor der Antwort Andriy Slobodyanyk