Hibernate использует стратегию, называемую инспекция , которая в основном такова: когда объект загружается из базы данных, его снимок сохраняется в памяти. Когда сеанс сбрасывается, Hibernate сравнивает сохраненный снимок с текущим состоянием. Если они различаются, объект помечается как грязный, и соответствующая команда SQL ставится в очередь. Если объект все еще временный, то он всегда грязный.
Источник: книга Hibernate in Action (приложение B: стратегии реализации ORM)
Важно отметить, однако, что грязная проверка Hibernate не зависит от методов equals / hascode . Hibernate вообще не смотрит на эти методы (кроме случаев использования java.util.Set, но это не связано с грязной проверкой, а только с API-интерфейсом коллекций). Снимок состояния, о котором я упоминал ранее, похож на массив значений. Было бы очень плохим решением оставить такой основной аспект фреймворка в руках разработчиков (если честно, разработчики не должны заботиться о грязной проверке). Само собой разумеется, что equals / hascode может быть реализован разными способами в соответствии с вашими потребностями. Я рекомендую вам прочитать процитированную книгу, там автор обсуждает стратегии реализации equals / hascode. Очень проницательное чтение.