Ich verwende Persistenz in einem Projekt für die Schule, und ich habe ein Problem, wenn ich versuche, Objekte zu löschen und zu aktualisieren, alle anderen Abfragen funktionieren.
Die Ausnahme ist:
%Vor%Ich schließe jede Sitzung, die ich geöffnet habe.
HibernateUtils-Code
%Vor%DAOPerson:
%Vor%Zur Information ist meine Kartendatei für Studenten:
%Vor%Und die Haupt-Mapping-Datei:
%Vor%Ich probiere viele Einstellungen aus, aber ich habe immer die selbe Ausnahme, wenn jemand eine Idee hat, ich will es!
Danke!
Entschuldigung für mein schlechtes Englisch
Die Sitzung soll nicht für einen Anruf verwendet und geschlossen werden. Die Verwendung der Dienstprogrammklasse als Basis für Ihr POJO ist keine gute Idee.
Die Entität, die gelöscht wird, sollte die gleiche Sitzung verwenden, von der sie abgerufen oder zumindest in der neuen Sitzung aktualisiert wurde, bevor sie entfernt wird.
Auch das Iterieren durch Entfernen der abhängigen 'Klassen' -Entitäten sollte durch eine Kaskade REMOVE ersetzt werden.
für Anfänger Ich denke, es ist eine gute Idee, den Namen, den Sie geben, um das Konzept der Klasse (path persistenceClass.Class) zu refactory. In Java ist "Class" eigentlich eine Klasse. Das könnte in der Zukunft zu einiger Verwüstung führen.
Ein Problem, das mir bei Ihrem DAOPerson-Code aufgefallen ist, ist, dass es seltsam aussieht. Ich habe verstanden, dass Sie versuchen, den aktuellen Schüler aus seinen Klassen zu entfernen, richtig? Falls ja, versuche den folgenden Patch auf deinem Code:
%Vor%Jetzt noch ein mögliches Problem: Ihr HibernateUtils behandelt Transaktionen nicht richtig. Sie sollten Ihren Code so umgestalten, dass er wie folgt aussieht:
%Vor%Hoffe das hilft!
Ich habe festgestellt, dass Sie lazy=false
nicht in Ihrer Personenzuordnungsdatei definiert haben. Daher nehme ich an, dass Sie das Attribut "lazy loading" für die Eigenschaft "Set" verwenden. Sie sagen, Sie haben alle Sitzungen vor einem Aufruf zum Entfernen geschlossen, und dann können Sie auf die Eigenschaft s.getClasses()
in der remove()
-Methode von DAOPerson
zugreifen, ohne eine lazyInitializationException
zu werfen. Wenn Sie lazy=false
in der Mapping-Datei vergessen haben, zählen meine Beobachtungen nicht. Wenn das nicht der Fall ist, dann haben Sie sicherlich eine Session geöffnet, an die die Person p (die an die DAO-Entfernungsmethode übergeben wurde) angeschlossen ist. Am Ende dieser Methode erhalten Sie eine Ausnahme, wenn Sie versuchen, das Objekt erneut mit einer anderen Sitzung zu verbinden.
Das Problem war auf einen Missbrauch der Kaskadenaktualisierung in einer der Zuordnungen zurückzuführen. Hier ist eine Beispielfeldzuordnung:
%Vor%Durch das Entfernen der cascade = CascadeType.ALL wurde das Problem behoben. Fazit: Verwenden Sie Kaskaden-Updates sorgfältig, da Sie dadurch in Schwierigkeiten geraten können. Verwenden Sie es, wenn die Geschäftslogik dies erfordert. In dem Beispiel unten gab es keinen Grund dafür, also war das Entfernen sowohl geschäftlich als auch programmatisch eine gute Entscheidung.
Quelle: Ссылка