# Hibernate: Caching



## Mr.Radar (23. Apr 2010)

Folgende Fragen beschäftigen mich - dürfte scheinbar mit dem Hibernate Caching irgendwie zusammenhängen:

1.) Ich habe eine List von Hibernate-Objekten A, wo ich über eine one-to-many Relation eine Liste von Objekten B hole. Wenn ich davor ein (zu A gehörendes) Objekt B hinzufüge, ist dies nicht in der Liste B vorhanden. (Erstelle ich mir die Liste  B jedoch "manuell" über eine Criteria Search mittels ID des Objekts A, ist das neue Objekt B darin enthalten) Was muss ich umstellen, damit ich die Liste B auch über die Relation holen kann?

2.) Ich speichere in einer Spalte Datumswerte im Format YYYY-DD-MM. Wenn ich ein Objekt hinzufüge, wird mir (in meinem Fall in der JTable) das Datum aber als "Wochentag, DD.MM.YYYY" angezeigt - erst wenn ich meine Application neustarte, wird es im gewünschten Format angezeigt - wie kann man das umgehen?

danke schonmal


----------



## SlaterB (23. Apr 2010)

1)
nochmal langsam, du hast

1. Liste von B in A initalisieren
2. B-Liste mit Criteria laden
3. neues B erstellen, A zuordnen (wie genau?)
4. das neue B ist nun in der einen Liste schon drin, in der anderen nicht oder wie ist der genaue Ablauf?

session.update(a);
oder
B selber direkt in die Liste von A hinzufügen?

-------

2.
was ist denn ein 'Datumswert', wie kommt es zur Anzeige?, Genauigkeit hilft manchmal durchaus,
ist es ein Date-Objekt und wird nur dessen toString() benutzt?

dann könnte ich mir vorstellen dass du beim ersten Mal das vom Programm neu erstellte Date anzeigst, es wurde zwar gespeichert ist aber noch das Original,
nach dem Neustart wird ein Date aus der DB geladen?

Date kann interne Details zur Darstellung gaben wie Locale, die Ausgabe eines Dates ist quasi unvorhersehbar, 
da solltest du dich nicht drauf verlassen, benutze SimpleDateFormat für die Ausgabe, 
dann ist es egal wie das Date-Objekt intern konfiguriert ist


----------



## Mr.Radar (29. Apr 2010)

Das mit dem Date hab ich prinzipiell gelöst, lasse es jetzt in jedem Fall durch ein DateFormat laufen, somit wird es nun immer richtig angezeigt. Was mich nur trotzdem daran wundert, ist, dass scheinbar (aufgrund der anfänglich unterschiedlichen Formatierungen) ein in einem zur Laufzeit angelegten Tupel enthaltenes Date, wenn ich mir den Tupel aus der DB hole, nicht aus der DB ausgelesen wird, sondern offenbar sonst noch irgendwo rumkugelt. IMHO ärgerlich, denn wenn ich Hibernate sage, dass es mir Daten aus der DB holen soll, sollte es sie auch von dort holen, und nicht von sonst irgendwo.

und ad 1.) verdeutliche ich:

ich habe eine Klasse "Befund", in dieser ist ein "Set<Behandlung> behandlungen" definiert.

Wenn ich zu einem bestimmten Befund "aBefund" eine Behandlung hinzufüge, und mir nachher über aBefund.getBehandlungen() das Set hole (innerhalb einer Session - lazyloading dürfte also nicht das Problem sein), ist die vorhin neu hinzugefügte Behandlung nicht dabei. Wenn ich mir aber mittels Criteria aus "Behandlung" all jene Tupel hole, die zu "aBefund" gehören, ist die neu hinzugefügte Behandlung dabei.
(Und erst nach einem Neustart der Applikation ist der "neue" Datensatz auch bei getBehandlungen() dabei...)

Auch dafür benutze ich derzeit den Workaround mittels der Criteria Search. Mein eigentliches Problem ist, dass es hier scheinbar mit dem Caching irgendetwas hat, und ich absolut keine Idee hab, wo das Problem liegt. (und das würd ich gerne lösen, sonst kommt es womöglich an anderer Stelle auch noch zu unerwarteten Fehlern...)


----------



## jlex (20. Mai 2010)

Ich denke das Problem ist, das Hibernate die Daten erst sammelt und dann speichert, nach dem commited oder geflusht worden ist und du aus Gründen der Transaktionssicherheit auf alten Objekten rumrödelst.


----------

