hibernate problema di inizializzazione pigra: LazyInitializationException: impossibile inizializzare pigramente una raccolta di ruolo
-
13-09-2019 - |
Domanda
Voglio gestire una transazione nel mio strato di persistenza, Ma quando provo a prendere i risultati pigramente ottengo questo errore:
org.hibernate.LazyInitializationException: impossibile inizializzare pigramente una raccolta di ruolo
Posso usare LockMode o qualsiasi altro modo per risolvere questo problema? Può un trovare un oggetto dal suo id senza alcuna transazione?
Soluzione
Il tuo problema è che la sessione Hibernate è già chiusa quando si tenta di accedere al contenuto. Hibernate non può caricare il contenuto senza una sessione. Di solito ci sono due modi per mitigare questo problema:
-
Non chiudere la sessione fino a quando si è fatto con la pagina. Questo modello si chiama "sessione in vista" e può per esempio essere implementato con un filtro servlet.
-
inizializzare tutti i contenuti che avrete bisogno prima di chiudere la sessione. Se si desidera inizializzare l'intero oggetto è possibile utilizzare Hibernate.initialize (oggetto).
modifica:. Non si può fare nulla al di fuori di una transazione in Hibernate
Altri suggerimenti
È anche possibile guardare la soluzione ufficiale da Hibernate a http://www.hibernate.org/43.html
In genere il problema è che uno degli attributi dell'oggetto è pigramente caricato. Una cosa che si può fare è quello di avere pre-caricato nella query:
da Sale dove sale.date>: startDate sinistra unirsi a prendere Vendita.Descrizione
Questo pre-fetch l'oggetto Vendita.Descrizione.
questo sito ha più informazioni: http://www.javalobby.org/ articoli / hibernate-query-101 / .
-Dave
Ci sono molti modi per pre-fetch proprietà, in modo che ci sono dopo la sessione viene chiusa:
- Basta chiamare appropriata getter. Dopo campo è inverosimile in fagiolo è lì dopo sessione viene chiusa.
- Usa attributo appropriato nel descrittore di fagiolo in JPA usereste
@OneToMany(fetch = FetchType.EAGER)
, ma ci sono simili Hibernate modi per farlo. - E 'possibile inizializzare campo nella query HQL (non sono sicuro se funziona in HQL, ma penso che non), cercare
FETCH INTO
parola chiave.
O semplicemente utilizzare un altro ORM ... come Ebean ORM dove lazy loading funziona:)