Hibernate illegaler Versuch, eine Sammlung mit zwei offenen Sitzungen zu verknüpfen

8

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

    
Geotinc 23.11.2010, 20:00
quelle

5 Antworten

4

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.

    
MikelRascher 14.03.2011 16:57
quelle
3

Verwenden Sie getCurrentSession() anstelle von openSession() und entfernen Sie die session.close(); -Anweisung.

    
SJ.Jafari 19.03.2011 13:03
quelle
2

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!

    
Lucas de Oliveira 16.03.2011 18:27
quelle
0

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.

    
Satadru Biswas 15.03.2011 08:25
quelle
0

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: Ссылка

    
Lazy Coder 19.12.2014 12:10
quelle

Tags und Links