Estoy obteniendo esta excepción en un controlador de una aplicación web basada en Spring framework que utiliza hibernate. He intentado muchas formas de contrarrestar esto, pero no pude resolverlo.La fila StaleObjectstateException fue actualizada o eliminada por
En el método del controlador, handleRequestInternal
, hay llamadas realizadas a la base de datos principalmente para 'leer', a menos que sea una acción de envío. He estado usando Spring's Session, pero me moví al getHibernateTemplate()
y el problema persiste.
básicamente, esta es la segunda llamada a la base de datos que arroja esta excepción. Es decir:
1) getEquipmentsByNumber(number)
{primero se obtiene un equipo de la base de datos en función del 'número', que tiene una lista de propiedades y cada propiedad tiene una lista de valores. Me bucle a través de esos valores (objetos primitivos cadenas) que se lee en las variables)
2) getMaterialById(id)
{recupera materiales a base de id}
entiendo que la segunda llamada, lo más probable, es hacer que la sesión "Flush", pero solo estoy "leyendo" objetos, entonces ¿por qué la segunda llamada arroja la excepción de estado obsoleto del objeto en la propiedad del Equipo si no hay cambios?
No puedo borrar la caché después de la llamada ya que causa LazyExceptions en los objetos que paso a la vista.
He leído esto: https://forums.hibernate.org/viewtopic.php?f=1&t=996355&start=0 pero no he podido resolver el problema en función de las sugerencias proporcionadas.
¿Cómo puedo resolver este problema? Cualquier idea y pensamiento son apreciados.
ACTUALIZACIÓN: Lo que acabo de probar es que en la función getEquipmentsByNumber()
después de leer las variables de la lista de propiedades, hago esto: getHibernateTemplate().flush();
y ahora la excepción es en esta línea en lugar de la llamada a buscar el material (que es getMaterialById(id)
).
ACTUALIZACIÓN: Antes de llamar explícitamente al ras, estoy quitando el objeto de caché de sesión para que ningún objeto rancio permanece en la memoria caché.
getHibernateTemplate().evict(equipment);
getHibernateTemplate().flush();
Bien, ahora el problema se ha movido a la siguiente obtención de DB después de que hice esto. ¡Supongo que tengo que etiquetar los métodos como sincronizados y expulsar los Objetos tan pronto como termine de leer sus contenidos! no suena muy bien
ACTUALIZACIÓN: Método handleRequestInternal
"sincronizado". El error desapareció Por supuesto, no es la mejor solución, pero ¡qué hacer! Probé en handleRequestInternal
para cerrar la sesión actual y abrir una nueva. Pero haría que otras partes de la aplicación no funcionen correctamente. Intenté usar ThreadLocal
que tampoco funcionó.
si pudiera publicar el código para el método que arroja la excepción, lo analizaré más a fondo. Suena como algo sospechoso – walnutmon