Внедрете hashCode и отложено зареждане

Това е обсъждано много (напр. тук и там) и за мен звучи полезно да използвам „бизнес“ ключове, когато внедрявам метода hashCode за обекти на Hibernate като:

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

Това е по-добре от използването на идентификатора в случаите, когато идентификаторът се генерира от хибернация (той ще бъде нулев за нови обекти).

Какво става, ако даден обект се състои само от „виртуални“ свойства, заредени отложено? Можех да изчисля hashCode въз основа на тях и го направих досега. Сега се натъкнах на проблема, че когато се извика hashCode(), сесията се затваря и така мързеливо заредените свойства вече не могат да бъдат достъпни. Какво да правим в такива случаи?


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


Отговори (1)


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

Бих предложил да извлечете с нетърпение съответните имоти. В някои редки случаи можете да използвате анотацията за хибернация @Formula, за да получите необходимите полета като производни свойства за изчисляване на equals и hashcode.

person Benjamin Bau    schedule 07.12.2015