Tabela JSF <rich:dataTable> do prezentacji korzystała z HashMapy z obiektami pobieranymi z bazy danych. Po zapisaniu nowych obiektów do bazy danych i odświeżeniu tabeli, na stronie pokazywały się dane zupełnie inne niż te, które znajdowały się w bazie. Po kilku godzinach bezskutecznych prób poskromienia JSF-a (bo myśleliśmy, że tam jest problem) okazało się, że przyczyna tkwi w zupełnie innym miejscu.
Otóż Eclipse generuje metodę equals() sprawdzając czy klasy porównywanych obiektów sa takie same:
...
іf (getClass() != obϳ.getClass()) {
return fаlse;
}
...
co w połączeniu z Hibernate może sprawić sporo kłopotów, bo często podczas wczytywania danych z bazy zamiast obiektu naszej klasy tworzony jest obiekt proxy rozszerzający klasę, którą wczytujemy. Przez co metoda powyżej zwróci false i obiekty w naszej HashMapie się nie odnajdą. Rozwiązaniem jest proste: należy stosować instanceof zamiast porównywania samych klas.
Dodatkowo, jak to jest opisane w komentarzu na blogu Proxorkut, jeśli stosujemy leniwe ładowanie, to w metodach equals i hashCode należy odwoływać się do zmiennych przez metody getXXX, a nie bezpośrednio, tak, aby Hibernate miał możliwość dociągnięcia z bazy brakujących danych.
Brak komentarzy:
Prześlij komentarz