Ich bin kein Anfänger im Winterschlaf, aber ich bin ein Anfänger in der Arbeit mit Hibernate im Frühjahr. Ich lese das Buch Frühling in Aktion. Also habe ich eine kleine Anwendung geschrieben, um die Beispiele im Buch zu verstehen. Hier eine Extraktion meiner Bewerbung. Ich kann dir mehr geben, wenn du willst.Session-Behandlung in Hibernate mit Spring
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public void runQuery()
{
final BuildingDAO buildingDAO = (BuildingDAO) applContext.getBean("buildingDAO");
final Building building = buildingDAO.getBuildingById("HQ");
logger.debug("Loaded building: " + building.getId());
logger.debug("Loaded building: " + building.getName());
}
Das Objekt wird ohne Probleme geladen. Das Protokoll des Primärschlüssels ist ebenfalls kein Problem. Das Protokoll des Zeichenfolgenattributs verursacht jedoch eine LazyInitializationException. Ich verstehe, warum das passiert. Hibernate hat einen Proxy mit Proxyattributen zurückgegeben. Wenn ich auf ein lazy-loaded-Attribut zugreifen möchte, hat Hibernate versucht, den Wert zu laden, aber die Sitzung wird geschlossen. Lazy Loading ist ein großartiges Feature von Hibernate und ich möchte es nicht verpassen.
Spring verwaltet die Session-Behandlung für mich. Spring öffnet eine Hibernate-Sitzung in der load-Methode der Hibernate-Vorlage und schließt die Sitzung, nachdem die Methode beendet wurde.
Aber jetzt möchte ich Spring darauf hinweisen, dass die Sitzung in der gesamten Methode (runQuery()) geöffnet sein sollte, die oben gezeigt wird. Ich möchte einige Attribute des Objekts anzeigen. Ich erwähnte, dass ich einen Tranaktionsmanager von Spring dazu benutzen kann. Also verwende ich die Transaktionsannotation von Spring. Aber es funktioniert nicht. Vielleicht ist meine Annahme falsch, den Transaktionsmanager zu verwenden.
Hat jemand eine Idee, Spring zu empfehlen, eine Sitzung für die gesamte Methode offen zu halten?