2009-07-16 2 views
9

Un oggetto che ho mappato con la sospensione ha uno strano comportamento. Per sapere perché l'oggetto si comporta in modo strano, ho bisogno di sapere che cosa rende quell'oggetto sporco. Qualcuno può aiutarmi e darmi un suggerimento?Come sapere cosa ha reso sporco un oggetto persistente di ibernazione?

L'oggetto è una classe Java in un contesto Java/Spring. Quindi preferirei una risposta rivolta alla piattaforma Java.

Modifica: desidero ottenere l'accesso allo stato di sospensione di Hibernate e al modo in cui viene modificato su un oggetto collegato a una sessione. Non so come potrebbe aiutare un pezzo di codice.

Per quanto riguarda il problema reale: all'interno di una transazione gestita da un TransactionManager di primavera faccio alcune query (leggi) su Oggetti e senza fare un salvataggio esplicito su questi oggetti vengono salvati dal TransactionManager perché Hibernate pensa che alcuni di questi (e non tutti) sono sporchi. Ora ho bisogno di sapere perché Hibernate pensa che quegli oggetti siano sporchi.

+0

Qualche ulteriore descrizione precisa dell'errore/problema più qualche codice potrebbe forse avere una migliore possibilità di una risposta – jitter

risposta

6

vorrei utilizzare un intercettore. Il metodo onFlushDirty ottiene lo stato corrente e precedente in modo da poterli confrontare. Implementare l'interfaccia Interceptor ed estendere EmptyInterceptor, ignorando onFlushDirty. Quindi aggiungi un'istanza di quella classe usando configuration.setInterceptor (Spring potrebbe richiedere di farlo in modo diverso). È inoltre possibile aggiungere un intercettore alla sessione anziché all'avvio.

Here is the documentation on interceptors.

+0

Che non vi dico cosa * * reso un oggetto sporco solo che i campi sono sporchi. Lo svuotamento avviene dopo che l'oggetto cambia stato, spesso alla fine della transazione. – Nat

0

Supponendo che non sia possibile accedere direttamente allo stato dell'oggetto (ad esempio, nessun campo pubblico o protetto da pacchetti) e non venga disturbato dal riflesso, è possibile inserire un punto di interruzione all'inizio di tutti i metodi dell'oggetto e scorrere attraverso scenario che rende l'oggetto sporco nel debugger.

0
  1. creare un Test Case o simile, in modo da poter riprodurre il problema con un solo clic.
  2. attivare la registrazione per org.hibernate controllare la registrazione per la stringa "sporco" (in realtà non hai bisogno di tutti org.hibernate, ma non so il logger esatto.
  3. Trova a macchie nel programma , uno in cui l'entità non è sporca, uno in cui è sporca.Ricerca la metà del codice tra i due punti e inserisci un'istruzione di registrazione lì, per registrare il valore isdirty. Continua con la strategia finché non hai ridotto il codice a una singola linea.
  4. Controllare il codice di sospensione. Trovare il codice che fa il controllo sporca. utilizzare un debugger al passaggio attraverso di essa.