JPA идентичность объекта и грязная проверка

java hibernate jpa entity

440 просмотра

1 ответ

997 Репутация автора

Из этого так ответьте :

Метод update () принудительно обновляет постоянное состояние объекта в базе данных, всегда планируя SQL UPDATE. ... Не имеет значения, был ли объект предмета изменен до или после его передачи в update (). ... Hibernate всегда рассматривает объект как грязный и планирует SQL UPDATE., Который будет выполняться во время сброса. С другой стороны, merge () сначала запрашивает базу данных и не выполняет обновление, если состояние не изменилось.

У меня возникло сомнение:
как Hibernate (или любая реализация JPA) может определить, изменилось ли состояние объекта, так что необходима операция обновления?
Должны ли мы реализовать метод equals или hashcode, чтобы помочь Hibernate сделать это? Что если не реализовать эти методы?

Автор: GionJh Источник Размещён: 18.07.2016 08:34

Ответы (1)


5 плюса

7807 Репутация автора

Решение

В Hibernate есть два механизма для грязной проверки. JPA - это спецификация, и поставщики должны выяснить, как это будет сделано. В случае гибернации:

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

Второй механизм - если вы используете Инструментарий на объектах Hibernate. В этом случае все обернуто в прокси. В этом случае hibernate не сравнивает сам объект, а вместо этого со временем вы изменяете значение, которое Proxy гарантирует, что объект помечен как грязный.

Вот один сайт, подробно описывающий два подхода: https://vladmihalcea.com/the-anatomy-of-hibernate-dirty-checking/

Автор: Alexandar Petrov Размещён: 18.07.2016 08:46
Вопросы из категории :
32x32