hibernate problema di inizializzazione pigra: LazyInitializationException: impossibile inizializzare pigramente una raccolta di ruolo

StackOverflow https://stackoverflow.com/questions/781751

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?

È stato utile?

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:

  1. 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.

  2. 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:

  1. Basta chiamare appropriata getter. Dopo campo è inverosimile in fagiolo è lì dopo sessione viene chiusa.
  2. Usa attributo appropriato nel descrittore di fagiolo in JPA usereste @OneToMany(fetch = FetchType.EAGER), ma ci sono simili Hibernate modi per farlo.
  3. 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:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top