Когда объект загружается через отложенную загрузку, это не экземпляр базового типа, а динамически генерируемый подтип, сгенерированный javassist, поэтому проверка того же типа класса завершится неудачей, поэтому не используйте: *
if (getClass() != that.getClass()) return false;
вместо этого используйте:
if (!(otherObject instanceof Unit)) return false;
, что также является хорошей практикой, как объясняется в Реализация равных в Java Practices .
по той же причине, при непосредственном доступе к полям может не работать и возвращать ноль вместо базового значения, поэтому не используйте сравнение со свойствами, а используйте геттеры, поскольку они могут инициировать загрузку базовых значений.