2011-10-04 13 views
10

Ho 2 server fisici su cui la mia applicazione Web colpisce gestiti da load balancer. Ho sempre trovato -org.hibernate.LazyInitializationException: impossibile inizializzare il proxy - nessuna sessione

org.hibernate.LazyInitializationException: impossibile inizializzare la procura - nessuna sessione

quando uno dei server sono colpiti, mentre l'altro si svolga senza problemi. Ho un archivio cache gestito locale abilitato e gestito dall'applicazione. Questa eccezione si verifica solo durante il tentativo di accedere a una particolare colonna da una tabella. Il resto delle operazioni funziona perfettamente indipendentemente dal server colpito.

Rendere pigro = falso diventerà un problema di prestazioni perché il numero di righe su quella tabella è piuttosto grande. E a proposito, stiamo usando get (oggetto) in sessione invece di caricare (oggetto).

risposta

5

L'oggetto è staccato. È necessario ricollegare alla sessione corrente prima di accedervi:

session.update(object); 

Assicurarsi inoltre si accede all'interno di una transazione

Leggi di più riguardo il problema/soluzione here

10

suona come la colonna a cui stai tentando di accedere è configurata come un'associazione di qualche tipo nella tua entità (OneToMany, ManyToOne, qualunque sia) e non stai compilando quell'associazione nel tuo DAO. Quindi, quando provi ad accedere a quella colonna (in una posizione nel tuo codice dove non c'è Hibernate Session), non è popolata, Hibernate prova a caricarlo e boom.

Dal momento che sono in realtà utilizzando i dati di tale associazione, il che rende EAGER suona come qualcosa che in realtà vorrebbe fare. E se quella tabella è così grande, dovresti cercare di indicizzarla in modo che le query siano efficaci.

+0

Ho un problema simile ma quando uso il tipo di recupero ansioso mi imbatto in un altro problema: hibernate tenta di aggiungere il mio oggetto a PersistentSet prima che il campo utilizzato per implementare hashcode/equals sia inizializzato. Nel mio codice ho un'eccezione generata se ciò accade, quindi fallisce miseramente (altrimenti il ​​metodo hashcode verrebbe violato). hai qualche idea su come aggiustarlo? –

+0

Avendo qualche problema. Dici "e non stai compilando quell'associazione nel tuo DAO". come si ottiene esattamente? –

0

È un'associazione o una proprietà: se si tratta di una proprietà, il problema potrebbe essere che uno dei server sta eseguendo una versione non strumentata.

Lazy attribute fetching: an attribute or single valued association is fetched when the instance variable is accessed. This approach requires buildtime bytecode instrumentation and is rarely necessary. 
12

Dai tag che hai fornito, deduco che hai riscontrato questo problema utilizzando Spring Framework. Mi sono imbattuto nello stesso LazyInitializationException durante l'utilizzo di Spring Data org.springframework.data.jpa.repository.JpaRepository.

Ho risolto il problema annotando il metodo che utilizza indirettamente Hibernate per recuperare i dati dal database con @Transactional.

Problemi correlati