Как узнать, что сделало сохраненный объект в спящем режиме грязным? - PullRequest
10 голосов
/ 16 июля 2009

Объект, который я отобразил в спящем режиме, имеет странное поведение. Чтобы понять, почему объект ведет себя странно, мне нужно знать, что делает этот объект грязным. Может кто-нибудь помочь и дать мне подсказку?

Объект является классом Java в контексте Java / Spring. Поэтому я бы предпочел ответ, ориентированный на платформу Java.

Редактировать: Я хотел бы получить доступ к грязному состоянию Hibernate и тому, как оно изменяется на объекте, присоединенном к сеансу. Я не знаю, как кусок кода поможет.

Что касается фактической проблемы: внутри транзакции, управляемой Spring TransactionManager, я делаю некоторые (читаемые) запросы к объектам, и без явного сохранения этих объектов они сохраняются TransactionManager, потому что Hibernate считает, что некоторые из них (и не все) грязные. Теперь мне нужно знать, почему Hibernate считает эти объекты грязными.

Ответы [ 3 ]

7 голосов
/ 17 июля 2009

Я бы использовал перехватчик. Метод onFlushDirty возвращает текущее и предыдущее состояние, чтобы вы могли сравнить их. Реализуйте интерфейс Interceptor и расширьте EmptyInterceptor, переопределяя onFlushDirty. Затем добавьте экземпляр этого класса с помощью configuration.setInterceptor (Spring может потребовать, чтобы вы делали это по-другому). Вы также можете добавить перехватчик в сеанс, а не при запуске.

Вот документация по перехватчикам.

1 голос
/ 16 июля 2009
  1. создайте контрольный пример или аналогичный, чтобы вы могли воспроизвести проблему одним щелчком мыши.
  2. включить ведение журнала для org.hibernate, проверьте ведение журнала на наличие строки «dirty» (на самом деле вам не нужен весь org.hibernate, но я не знаю точного средства ведения журнала.
  3. Найдите места в программе, где нет грязных объектов, а где нет. Найдите середину кода между двумя точками и поместите туда инструкцию для регистрации значения isdirty. Продолжайте придерживаться стратегии, пока код не уменьшится до одной строки.
  4. Проверьте код гибернации. Найдите код, который выполняет грязную проверку. Используйте отладчик, чтобы пройти через него.
0 голосов
/ 16 июля 2009

Предполагая, что состояние объекта не может быть доступно напрямую (например, нет открытых или защищенных пакетов полей) и не зависит от отражения, вы можете установить точку останова в начале всех методов объекта и выполнить сценарий. что делает объект грязным в отладчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...