2013-09-30 18 views
5

Sto utilizzando Hibernate 4.2.4 con JPA e caricamento Layz in un'associazione ManyToMany. L'oggetto A è associato a @ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY) e viceversa. Per ottenere i dati dal database che io chiamo il seguente codice (semplificato):hibernate gestione sessione con caricamento lazy

try { 
    session = cutSessionFactory.openSession(); 
    session.beginTransaction(); 
    List<IBO> result = session.createQuery(query).list(); 
    session.getTransaction().commit(); 
    return result; 
catch{...} 
finally{ 
    session.close; 
} 

Originariamente ho usato per lasciare la connessione aperta, perché se la mia domanda ha bisogno di fare un po 'lazy loading la sessione è ancora necessaria dopo la prima chiamata. Ma mentre questo ha reso la mia applicazione bloccata dopo alcune azioni, sono passato alla strategia precedente. Ora tutto funziona; nessun congelamento, nessun problema con il caricamento pigro. Ma se carico un soggetto, che ha alcuni bambini (che requieres lazy loading) il registro dice:

WARN - AbstractPersistentCollection: Unable to close temporary session used to load lazy collection associated to no session

seguito da

2013-09-25 09:35:30 - INFO - BasicResourcePool: A checked-out resource is overdue, and will be destroyed: com.mchange.v2.c3p[email protected] 
2013-09-25 09:35:30 - INFO - BasicResourcePool: Logging the stack trace by which the overdue resource was checked-out 

Ha senso che ibernazione non è la chiusura della sessione (In realtà ho pensato che ci sia una nuova richiesta di caricamento lazy che utilizza una nuova sessione) e il pool di connessioni riconosce che c'è una sessione inutilizzata. Ma alla fine l'ibernazione fissa la mia "cattiva gestione delle sessioni".

Così qualcuno sa un modo migliore per gestire le sessioni utilizzate con il caricamento lazy?

+0

ha u trovare un risposta? quando vedi questo avviso, la connessione (da c3p0) è chiusa? o c'è una perdita di pool di connessione? – OhadR

risposta

0

Ovviamente è necessario chiudere la sessione altrimenti l'applicazione potrebbe non funzionare correttamente.

Inoltre, dovremmo provare a mantenere pigro l'oggetto nidificato per prestazioni migliori e aggiungere join obbligatori.

Se avete bisogno di accedere l'elemento figlio si deve applicare unirsi nella query, in modo che l'oggetto pigro otterrà caricato ad esempio:

class A{ 
     B b; 
} 

sql:

select * from A Left join B on A.bid = B.id 
Problemi correlati