-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: Object und dazugehörige collections neu laden
PostPosted: Mon Feb 25, 2008 7:37 am 
Newbie

Joined: Mon Feb 25, 2008 6:45 am
Posts: 3
Hallo,

ich habe folgendes Problem und komme nicht weiter.
Ich habe ein Objekt "VeVeranstaltung". Dazu gehört eine Collection "VeKonzert".

Auf folgende Weise lösche ich ein Konzert aus der Collection.

Code:
session.delete(selected);
if (set != null) {
set.remove(selected);
}


Das "set" wird in einer JTable dargestellt. "selected" ist das ausgewählte Element in der Tabelle. Aus der tabelle verschwindet das Konzert dann auch. Wenn ich jetzt ein session.flush() ausführe wird das ganze auch auf die Datenbank geschrieben.

Jetzt möchte ich diese Änderung aber nicht speichern, weil ich das Konzert z.B. versehentlich gelöscht habe, sondern die Veranstaltung mitsamt aller Konzerte neu laden. session.refresh(veranstaltung) geht bei Lazy Loading laut anderen Topics hier im Forum nicht. In einem Topic habe ich aber folgende Variante gefunden:

Code:
session.evict(veranstaltung);
session.get(VeVeranstaltung.class, veranstaltung.getVerid();


Gefunden unter: http://forum.hibernate.org/viewtopic.ph ... 3e7a496574


Das funktioniert auch ganz ganz prima, solange ich das Objekt "veranstaltung" selbst ändere, z.B. einen neuen Titel eingebe, dann nicht speichere sondern mit evtcit() und get() neu lade, dann habe ich den alten Titel wieder und kann normal weiterarbeiten.

Wenn ich aber die Collection ändere, (z.B. ein Konzert entferne) wird beim neu laden das Konzert zwar wieder in der JTable angezeigt, aber die Abfrage session.isDirty() ergibt TRUE. Dadurch bekomme ich in meiner Anwendung ständig die Abfrage "Möchten Sie speichern?" obwohl ich ja den alten Stand wieder haben möchte. Nach einem klick auf "ja" wird ein Commit aufgerufen, es fehlt dann das Konzert in der Veranstaltung.
Bei einem Klick auf "nein" bleibt session.isDirty() == true.

Wenn ich mir das Objekt "veranstaltung" in meiner Entwicklertool (JDeveloper) genauer anschauen stelle ich fest, das nach dem Aufruf durch session.get(). Alle Daten von "veranstaltung" wieder da sind, aber in der zugeordneten collection getVeKonzerts() is das Set "null". Hier wird die Collection also nicht neu von der Datenbank geladen. session.load() habe ich auch schon ausprobiert. Dann wird nicht mal mehr der Titel neu geladen, alle Informationen werden mir als "null" angezeigt.

kann hier jemand weiterhelfen? Oder muss ich noch mehr Informationen geben?

Vielen Dank schonmal im Vorraus[/quote]


Top
 Profile  
 
 Post subject:
PostPosted: Mon Feb 25, 2008 5:02 pm 
Expert
Expert

Joined: Thu Jul 05, 2007 9:38 am
Posts: 287
Hi,
die 'null' Werte müssen nicht unbedingt etwas bedeuten, dass kann gut durch den Hibernate Proxy entstehen. Nur wenn die Getter wirklich null liefern solltest du dir Gedanken machen.

Ansonsten:
- Prüfe die Cascade Einstellungen, da sollte auf jeden Fall evict mit Berücksichtigt sein.
- Mit dem Dirty Flag könnte eventuell ein Rollback helfen.
- Ansonsten aktiviere doch mal das SQL Logging und mach ein Flush, da sieht man dann ja, was Hibernate für dirty hält.
- Wenn alles nicht hilft: Session zu machen und eine neue öffnen.

Jens

_________________
Please rate useful posts.


Schauderhaft: Softwaredevelopment, Projectmanagement, Qualitymanagement and all things "schauderhaft"


Top
 Profile  
 
 Post subject:
PostPosted: Wed Feb 27, 2008 5:54 am 
Newbie

Joined: Mon Feb 25, 2008 6:45 am
Posts: 3
schauder wrote:
- Ansonsten aktiviere doch mal das SQL Logging und mach ein Flush, da sieht man dann ja, was Hibernate für dirty hält.
Jens


Das hat mir schon etwas weitergeholfen. Vielen Dank!
Anhand des SQL Loggings erkenne ich, dass die Session wegen dem gelöschten Konzert "dirty" ist, das heißt nach dem Aufruf von session.flush() wird das Konzert gelöscht. Auch wenn ich erst ein transaction.rollback() ausführe und dann session.flush() ist das Konzert weg.

Aber eigentlich wollte ich ja, dass durch das neu laden der Veranstaltung mit dem Befehl get(VeVerannstaltung.class, getVerId()) auch die dazugehörigen Collections neu geladen werden.

Die Session behält aber das vorher ausgeührte session.delete(selected) welches beim Löschen des Konzerts aus der Veranstaltung aufgrufen wurde. Deshalb hat es glaube ich auch nicht geholfen, dass ich bei den cascade Einstellungen evict mit berücksichtige, das session.delete bleibt ja.

Wie bekomme ich es also hin, dass das gelöschte Konzert beim neu laden der Veranstaltung auch wieder neu von der Datenbank in die Session geladen wird? Muss es vielleicht auf eine andere weise löschen?

Vielen Dank für die Hilfe


Top
 Profile  
 
 Post subject:
PostPosted: Wed Feb 27, 2008 8:07 am 
Newbie

Joined: Mon Feb 25, 2008 6:45 am
Posts: 3
Ich denke ich habe die Lösung gefunden.

Wenn ich das session.delete(selected) weglasse und stattdessen das Konzert nur aus dem Set entferne, dann klappts zwar mit dem neu laden, aber bisher war das Konzert nach dem speichern wieder dann wieder da, wenn ich es dann wirklich mal von der Veranstaltung löschen wollte.

Jetzt habe ich aber mal, wie von "schauder" vorgeschlagen, die cacade Einstellungen überprüft. Dort habe ich delete-orphan eingefügt.

Jetzt wird das Konzert beim speichern richtig gelöscht, und falls ich es doch nicht speichern will, ist das Konzert nach dem neu laden wieder da.

Werde das mal durchtesten.

Schöne Grüße
Mondi


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.