Newsgroup: it.comp.java
Titolo: Hibernate Help!!!

Ciao,
ho fatto delle prove con Hibernate e devo dire che mi trovo bene...molto 
bello.
Ora ci sto lavorando in ambito WEB e di solito realizzo delle servlet per la 
parte di logica, mentre delle jsp per la parte di visualizzazione (il 
passaggio tra le due lo faccio con RequestDispatcher). Il problema si pone 
nella parte di viasualizzazione, poiché apro una sessione di Hibernate: 
Session session = HibernateUtil.currentSession(); all'inizio e la chiudo 
alla fine: HibernateUtil.closeSession();. Già questo non mi piace, ma il 
problema si pone quando all'interno della pagina jsp utilizzo delle classi 
che a loro volta aprono e "purtroppo" chiudono la session...generando così 
degli errori. Vi chiedo quindi se potet suggerirmi un metodo per gestire la 
sissione...se avate anche qualch pezzo di codice....THX
Ciao, Davide 
----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeeds.com
 The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----

 sissione...se avate anche qualch pezzo di codice....THX
Evita di fare accessi al db dentro le jsp. Visto che hai fatto trenta 
impegnandoti a separare la logica, fai trentuno.
Un suggerimento per un quick start di una applicazione web con struts, 
hibernate e springs:
http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse

 
http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse
Ok, ma utilizzo lazy="true", quindi cosa passo alla jsp...comunque Hibernate 
farà una qualche richiesta, e se ho già chiuso la sessione??



Con Hibernate é la cosa piu' comune e anche ben consigliata quella di fare 
accessi al database durante l'esecuzione delle JSP (ovviamente solo in 
lettura).
Come mai dici ciò?

 la sissione...se avate anche qualch pezzo di codice....THX
La cosa che solitamente si fa con Hibernate é quella di:
-attaccare la sessione al thread all'inizio della richiesta (tramite un 
filtro).
-utilizzare sempre la stessa sessione in tutte le classi
-fare il commit e chiudere la sessione alla fine della request.
Solitamente si fa con un ThreadLocal (che permette appunto di associare un 
oggetto al thread corrente), oppure ancora meglio utilizzando Spring e 
l'OpenSessionInViewFilter che ti mette a disposizione.
Questo "pattern" appunto ti permette di lasciare aprta la sessione durante 
la View, evitandoti in parte le difficoltà delle collezioni non 
inizializzate che spesso sono motivo di tribolazioni per il programmatore.
Comunque scarica l'esempio di hibernate, mi pare si chiami CaveatEmptor, che 
dovrebbe implementare in modo abbastanza semplice quanto ti ho detto.

alberto wrote:

Perchè non so dove sia consigliato, ma è più consigliato racchiudere gli 
accessi al db nei DAO mentre nei framework che implementano il pattern 
MVC i jsp sono destinati alla sola visualizzazione (no logica, no 
accessi al db).

 db).
Ah ho capito, intendevamo 2 cose diverse.
Nella jsp quando si itera su di una collection Hibernate fa spesso accessi 
al database (con le collezioni lazy), ma non programmaticamente certo.

 ha scritto nel messaggio 
news:4279204c$0$2195$5fc...@news.tiscali.it...

Ho visto l'esempio, e mi sembra che salvano la sessione di Hibernate in una 
sessione, quindi le classi che utilizzo prendono la sessione dalla classe 
statica HibernateUtil, sarà poi il filtro a chiuderla. Non ho ancora ben 
capito chi la apre....
Non é che per caso hai un esempio funzionante?


 Non é che per caso hai un esempio funzionante?
La aprono le classi che gestiscono l'accesso al database!
Non mi ricordo bene come faccia l'esempio d hibernate, comunque io prima di 
passare a Spring usavo una class  HibernateUtil con un metodo getSession() 
che mi tornata la sessione del thread e se non era stata ancora richiesta da 
quel thread prima l'attaccava al thread stesso.
Quindi la sessione non viene aperta dal filtro ma solo dalle classi che 
accedono al database (tipicamente le classi DAO).
Ad esempio un metodo di un dao potrebbe essere:
public Normativa getNormativaById(Integer normativaId)
        throws InfrastructureException {
        Normativa norm = null;
        try {
            Session session = HibernateUtil.getSession();
            norm = (Normativa) session.load(Normativa.class, normativaId);
        } catch (HibernateException ex) {
            throw new InfrastructureException(ex);
        }
        return norm;
    }
dove
Session session = HibernateUtil.getSession();
apre la sessione e la attacca al thread se questa non è già stata attaccata 
al thread. altrimenti semplicemente restiuisce la sessione del thread.
Questo dovrebbe farti intuire che non ci sono grosse problematiche di 
performance:
non è vero che ogni request genera la creazione di una sessione, poiché 
questo avviene solamente quando si fa effettivamente un accesso al database 
tramite una classe DAO.

 al database (con le collezioni lazy), ma non programmaticamente certo.
Io intendevo semplicemente che dentro le jsp NON dovrebbe esserci una 
riga in java che riguardi logica applicativa e accesso al database, 
compreso l'utilizzo di sessioni hibernate. Gli strumenti ci sono. 
Oltretutto, non vedo convenienza nel gestire la persistenza dentro una 
pagina jsp, tanto vale utilizzare il tag sql delle standard tag library.

 
Devi garantire che cio' che passi alla JSP (cioe' al di fuori della
sessione) sia gia' inizializzato. A questo scopo e' sufficiente
invocare nella action i metodi che restituiscono cio' che e' lazy,
oppure si puo' usare il metodo Hibernate.initialize().
Personalmente mi trovo d'accordo con Vincent sull'evitare di "trascinare"
la sessione fino alla JSP, anche se a volte e' molto comodo. La maggior
parte delle volte e' pero' solo pigrizia e mancata progettazione delle
JSP, che risultano cosi' molto complesse perche' vengono adattate ai dati
da visualizzare, invece di fare il contrario, cioe' preparare i dati per
la visualizzazione.
-- 
Lucio Benfante
Java User Group Padova: 
http://www.jugpadova.it
Brainbench MVP for Java 1: 
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064