W przypadku implementacji implementacji #equals
dla UDT w Javie, jednym z warunków jest to, że przekazany obiekt argument musi być instancją bieżącej klasy, w przeciwnym razie będziemy działać bezbłędnie return false
zobacz Effective Java (EJ2) . Jednak podczas korzystania z Hibernate 4 możemy skończyć z instancjami proxy javassist z powodu leniwego ładowania, gdzie ten warunek nie powiedzie się. Jaki byłby najlepszy wybór, aby przezwyciężyć to? Oto kilka opcji, które mogę wybrać:Serwery proxy hibernacji i `Obiekt # jest równy`
- rozszerzyć implementację
equals
, aby uwzględnić przypadek proxy. Wady: opłata za utrzymanie, zależność hardwired od infrastruktury proxy Hibernacji, modele hacky, encje lub domeny powinny być agnostyczne w stosunku do ORM, tj. Ponieważ mogą być ponownie wykorzystane w różnych kontekstach, gdzie nie ma potrzeby ORM, np. Swing UI. - sprawdź, czy jest to proxy przed wywołaniem
equals
. Wady: nie zawsze jest możliwe, tj. Zajmowanie się kolekcjami i niejawnymi wywołaniamiequals
, np. Mapą. - Powstrzymaj się od używania leniwego ładowania. Wady: nierozsądne ani skuteczne we wszystkich przypadkach użycia.
UPDATE
Przegląd EJ2 znowu wierzę, że dalej będzie działać dla wszystkich scenariuszy (typu, typ-proxy, proxy-Type i Proxy-proxy), ale jak podkreślił w jednym z komentarzy poniżej może zapętlić się na zawsze, jeśli Typ zostanie porównany do zupełnie innego typu, np Person.equals(Employee)
i oba używają tego samego kryterium EJ2.
if (this.getClass() != anObject.getClass())
{
return anObject.equals(this);
}
tylko upewniając się, że serwer proxy rozszerzy klasę twojej jednostki? –
instancje proxy nie rozszerzają się, zobacz 'InvocationHandler' i warunek' (this.getClass() == anObject.getClass()) ', oczywiście, oceni na false. –
Porzuciłeś opcję: zignoruj porady dotyczące efektywnej wersji Java i zezwól na podklasy w .equals(). –