Ich verwende hibernate 3.2.7 ohne Frühling (fragen Sie nicht, Client unterstützt nicht Frühling) und ich bin in ein Problem mit meiner Implementierung des Open-Session-in-View-Musters laufen. Wenn ich ein Objekt durch den Aufruf von save() in der Datenbank persistiere, rufe ich anschließend get() für dieses Objekt auf, um die Details der untergeordneten Objekte zu laden, die durch Fremdschlüssel in der Datenbank dargestellt werden. Das Problem ist, dass beim Aufruf von get() keines der untergeordneten Objekte geladen wird. Wenn ich die get()-Methode aus einer neuen Transaktion aufrufe, wird alles wie erwartet geladen.
Dies ist ein Ausschnitt aus meinem Anfragefilter, der die Sitzung öffnet und die Transaktion erstellt:
HibernateUtil.openSession();
//get a transaction from JTA
transaction = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
transaction.begin();
// Call the next filter (continue request processing)
chain.doFilter(request, response);
// Commit and cleanup
log.finer("Committing the database transaction");
transaction.commit();
Hier ist ein Ausschnitt aus der Speichermethode der Serviceschicht, die die Transaktion speichert:
session.setFlushMode(FlushMode.MANUAL);
contract.save();
//save the update to the database
session.flush();
Nachdem das Objekt persistiert wurde, wird die Anfrage an eine Struts-Aktionsklasse übergeben, die die get()-Methode im Dienst aufruft, die diesen Code zum Laden des Vertrags enthält:
Session session = HibernateUtil.getSession();
session.setFlushMode(FlushMode.MANUAL);
try {
contract = contract.get();
...
}
Dieselbe Get-Action-Methode wird beim Laden eines persistierten Vertrags aufgerufen, was gut funktioniert, so dass ich weiß, dass die Get()-Methode ordnungsgemäß funktioniert, wenn sie in einer eigenen Transaktion isoliert ist. Das einzige Mal, dass es nicht funktioniert, ist, wenn es direkt nach dem save() aus derselben Transaktion aufgerufen wird.