2009-07-16 9 views
9

Un objeto que mapeé con hibernación tiene un comportamiento extraño. Para saber por qué el objeto se comporta de manera extraña, necesito saber qué hace que ese objeto se ensucie. ¿Alguien puede ayudarme y darme una pista?¿Cómo saber qué hace que un objeto persistente de hibernación esté sucio?

El objeto es una clase de Java en un contexto de Java/Spring. Así que preferiría una respuesta dirigida a la plataforma Java.

Editar: Me gustaría obtener acceso al estado sucio de Hibernate y cómo cambia en un objeto adjunto a una sesión. No sé cómo un pedazo de código podría ayudar.

En cuanto al problema real: dentro de una transacción gestionada por Spring TransactionManager realizo algunas consultas (leídas) en Objetos y sin hacer un guardado explícito en estos Objetos, son guardados por el TransactionManager porque Hibernate piensa que algunos de ellos (y no todos) están sucios. Ahora necesito saber por qué Hibernate piensa que esos Objetos están sucios.

+0

Algunos descripción más exacta del error/problema más algo de código podría tal vez obtener una mejor oportunidad para una respuesta – jitter

Respuesta

6

me gustaría utilizar un interceptor. El método onFlushDirty obtiene el estado actual y el anterior para que pueda compararlos. Implemente la interfaz Interceptor y extienda EmptyInterceptor, anulando enFlushDirty. Luego agregue una instancia de esa clase usando configuration.setInterceptor (Spring puede requerir que haga esto de manera diferente). También puede agregar un interceptor a la sesión en lugar de agregarlo al inicio.

Here is the documentation on interceptors.

+0

Eso no le dirá lo que * * hizo un objeto sucio solamente los campos que están sucios. La descarga ocurre después de que el objeto cambia de estado, a menudo al final de la transacción. – Nat

0

Suponiendo que no se puede acceder directamente al estado del objeto (p. Ej., No campos públicos o protegidos) y no se modifica por reflexión, puede poner un punto de interrupción al inicio de todos los métodos del objeto y ejecutarlo escenario que ensucia el objeto en el depurador.

0
  1. crear una caja de prueba o similar, por lo que puede reproducir el problema con un solo clic.
  2. habilitar el registro para org.hibernate comprobar el registro de la cadena "sucio" (en realidad no es necesario todo el org.hibernate, pero no sé el registrador exacto.
  3. Encontrar lugares en el programa , uno donde la entidad no está sucia, otra donde está sucia. Busca el medio del código entre los dos puntos, y coloca allí una declaración de registro para registrar el valor de isdirty. Continúa con la estrategia hasta que hayas reducido el código a una sola línea.
  4. salida del código de hibernación. Encuentra el código que realiza el chequeo de sucio. use un depurador para recorrer la misma.
Cuestiones relacionadas