Реализуйте хэш-код и ленивую загрузку

Это много обсуждалось (например, здесь и там), и мне кажется полезным использовать" бизнес-ключи "при реализации метода hashCode для таких объектов Hibernate, как:

public class User {
    private String username;
    ...
    @Override
    public int hashCode() {
        //Calculate on base of username
    }
}

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

Что, если сущность состоит только из «виртуальных» лениво загружаемых свойств? Я мог рассчитать хэш-код на их основе и до сих пор это делал. Теперь я столкнулся с проблемой, заключающейся в том, что при вызове hashCode() сеанс закрывается, и поэтому к ленивым загруженным свойствам больше нельзя получить доступ. Что делать в таких случаях?


person mosquito87    schedule 07.12.2015    source источник


Ответы (1)


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

Я бы посоветовал с радостью получить соответствующие свойства. В некоторых редких случаях вы можете использовать аннотацию @Formula hibernate, чтобы получить необходимые поля в качестве производных свойств для вычисления equals и hashcode.

person Benjamin Bau    schedule 07.12.2015