2011-10-04 14 views
10

Tengo 2 servidores físicos que mi aplicación web recibe administrados por equilibradores de carga. Siempre me -org.hibernate.LazyInitializationException: no se pudo inicializar el proxy - no Sesión

org.hibernate.LazyInitializationException: no se pudo inicializar proxy - ninguna sesión

cuando uno de los servidores son golpeados mientras que el otro se ejecuta sin problemas y sin ningún problema. Tengo una tienda de caché administrada local habilitada y administrada por la aplicación. Esta excepción solo ocurre cuando se intenta acceder a una columna particular de una tabla. El resto de las operaciones funcionan absolutamente bien independientemente del servidor afectado.

Hacer que lazy = false se convierta en un problema de rendimiento porque el número de filas en esa tabla es bastante grande. Y por cierto, estamos usando get (object) en session en lugar de load (object).

Respuesta

5

Su objeto es extraído. Es necesario volver a colocarla en la sesión actual antes de acceder a ella:

session.update(object); 

También asegúrese de que acceda a ella dentro de una transacción

Leer más sobre el problema/solución here

10

que suena la columna a la que intenta acceder está configurada como una asociación de algún tipo en su entidad (OneToMany, ManyToOne, lo que sea) y no está completando esa asociación en su DAO. Luego, cuando intenta acceder a esa columna (en una ubicación en su código donde no hay sesión de Hibernate), no está poblada, Hibernate intenta cargarla y boom.

Dado que de hecho está utilizando los datos de esa asociación, por lo que es EAGER suena como algo que realmente querría hacer. Y si esa tabla es tan grande, debería ver cómo indexarla para que las consultas en su contra sean eficientes.

+0

Tengo un problema similar, pero cuando uso el tipo de búsqueda con ganas me encuentro con un problema diferente: hibernate intenta agregar mi objeto a un PersistentSet antes de que se inicialice el campo utilizado para implementar hashcode/equals. En mi código tengo una excepción lanzada si eso sucede, por lo que falla miserablemente (de lo contrario, se violaría el método de código hash). ¿Alguna de idea de cómo arreglarlo? –

+0

Tiene algún problema. Usted dice 'y no está poblando esa asociación en su DAO'. ¿cómo es exactamente eso logrado? –

0

Es una asociación o propiedad; si se trata de una propiedad, entonces el problema podría ser que uno de los servidores está ejecutando una versión no instrumentada.

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

De las etiquetas que proporcionó, deduje que se encontró con este problema utilizando Spring Framework. Me encontré con el mismo LazyInitializationException durante el uso de un Spring Data org.springframework.data.jpa.repository.JpaRepository.

Resolví el problema anotando el método que indirectamente utiliza Hibernate para recuperar datos de la base de datos con @Transactional.

Cuestiones relacionadas