Прочитал этот пост Влада, и пост Марка, на который Влад отвечает. Как-то слишком поверхностно. Марк пишет, что если переопределить equals/hashCode, то будут проблемы с merge/getReference, а Влад отвечает, что не будет. Но, блин,
какие именно проблемы?) Как вообще можно отвечать, что проблем не будет, если Марк не написал,
какие именно проблемы он имеет ввиду..
Влад отвечает:
> As for getReference(), there’s a check for that as well. It’s all on GitHub.
Открываю ссылку на гитхаб. Там всего лишь проверка того факта, что в сете находится объект, полученный через getReference() (вызванный в другой сессии), т.е. проверка на то, что equals работает.
Но, возможно, Марк имел ввиду совсем другую проблему. На сколько я помню, в Хибернейт (по крайней мере раньше так было, давно с ним не работал) довольно плохо работал getReference(). Он загружал (может и до сих пор загружает) весь объект, т.е. генерировал SELECT... Т.е. работал как find. Не знаю, связано ли это как-то с equals/hashCode, как-то раньше не задумывался (у меня они обычно переопределены примерно так, как у Влада - и это дефолтный способ в AbstractPersistable от spring-data-jpa).
Возможно, это никак и не связано с equals/hashCode, а связано с AccessType у ID. У Хибера еще одна проблема есть (или была): если ставить аннотации над полями сущности (как чаще всего делают), то
user.getRole().getId()
триггерит загрузку
Role
, даже если она LAZY (имеется ввиду связь User-Role many-to-one). Если же у ID сделать
@Access(AccessType.PROPERTY)
, то не триггерит (что хорошо, ведь у нас уже есть
role_id
в памяти - это FK в таблице User. В Keycloak используют этот "хак" -
https://github.com/keycloak/keycloak/blob/master/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserEntity.java#L70). Возможно, это и на
getReference()
как-то влияет. Хотя вряд ли.
В любом случае, попытка Влада опровергать такое нечеткое утверждение ("Even Vlad’s advanced version does have holes. E.g. if you use em.getReference() or em.merge()." - Mark) выглядит как-то странно. Сначала нужно понять, в чем именно Марк видит проблему.