Как hibernate использует equals () и hashCode ()? - PullRequest
9 голосов
/ 08 ноября 2011

Если вы загрузите сущность из базы данных и измените ее каким-либо образом, будет ли Hibernate использовать equals / hashCode для сравнения текущего состояния сущности с ее снимком, чтобы определить, нужно ли выполнять обновление sql?

Если он выполняет такое сравнение, у меня возникает другой вопрос: если equals вернет true, будет ли Hibernate думать, что объект не изменился, или попытаться использовать его по умолчанию (чтобы быть уверенным)?

Ответы [ 2 ]

9 голосов
/ 08 ноября 2011

См. Равен и HashCode с веб-сайта JBoss Community. Оттуда:

Чтобы избежать этой проблемы, мы рекомендуем использовать атрибуты "semi"-unique. вашего постоянного класса для реализации equals () (и hashCode ()). В основном вы должны думать об идентификаторе вашей базы данных как о не имеющем деловое значение вообще (помните, атрибуты суррогатного идентификатора и автоматически генерируемые вейлы рекомендуются в любом случае). База данных Свойство идентификатора должно быть только идентификатором объекта, и в основном должен использоваться только Hibernate. Конечно, вы также можете использовать идентификатор базы данных как удобный дескриптор только для чтения, например, строить ссылки в веб-приложениях.

Другими словами, Hibernate использует equals и hashCode для идентификации, чтобы не видеть, был ли объект изменен. Для этого он использует сравнение атрибутов.

3 голосов
/ 08 ноября 2011

Не эксперт по Hibernate, но вы можете найти этот раздел ручного просветления.

...