JPA грязная проверка - PullRequest
       30

JPA грязная проверка

3 голосов
/ 14 декабря 2011

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

Мой вопрос: как JPA отслеживает изменения? Сущности не перехватываются (через прокси-серверы), поэтому, конечно, это не происходит через перехват «сеттеров», как это делается?

Я заинтересован в деталях реализации этой функции "грязной проверки".

Ответы [ 3 ]

7 голосов
/ 14 декабря 2011

Они делают что-то, что полностью зависит от реализации (т. Е. Спецификация JPA здесь вам не поможет).

Некоторые реализации (например, DataNucleus, OpenJPA) используют усовершенствование байт-кода и способны эффективно управлять тем, какие поля загрязнены с момента загрузки (и нет необходимости сохранять снимок исходных значений полей).

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

5 голосов
/ 14 декабря 2011

Они делают снимок загруженных объектов во время загрузки, сохраняют эти снимки в памяти и сравнивают, во время сброса, снимок объектов с их текущим состоянием.Если состояние отличается, сущность должна быть обновлена.Если они все еще совпадают, это не должно.

0 голосов
/ 02 апреля 2015

Обратите внимание, что тем временем hibernate расширил свои грязные опции проверки.Hibernate теперь также поддерживает инструментарий байтового кода и пользовательские опции грязной проверки.См. эту ссылку для получения дополнительной информации об этих новых опциях.

...