Pokazywanie postów oznaczonych etykietą Eclipse. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Eclipse. Pokaż wszystkie posty
23 kwietnia 2010
Moje pierwsze TDD, czyli dlaczego NetBeans wymięka
Ten postał został przeniesiony na mojego nowego bloga i można go znaleźć tutaj.
9 maja 2009
Eclipse i problem z generowanymi equals()
Ostatnio w pracy kolega natrafił na następujący problem:
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:
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.
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.
Subskrybuj:
Posty (Atom)