Miesięczne archiwa: Lipiec 2011

JPA i walidacja encji w projekcie GWT

Całkiem niedawno opisywałem moje boje z mechanizmem RequestFactory, który okazał się być całkiem fajnym tworem. Za jego pomocą udało się nam wtedy stworzyć aplikację z serwisami zorientowanymi na dane, gdzie warstwę dostępu do danych zapewniał nam Hibernate. Aplikacja potrafiła wykonać jedynie podstawowe operacje CRUD na pojedynczej encji i już wtedy zapowiedziałem, że w dalszym ciągu czekają na nas relacje między encjami oraz walidacja encji. Dzisiaj będę kontynuować stworzony wtedy projekt i zajmę się drugim z zapowiedzianych tematów, czyli normą JSR 303 definiującą reguły sprawdzania poprawności obiektów. Walidacja nie będzie skomplikowana i ma na celu jedynie pokazanie działania wraz z mechanizmem RequestFactory.

Aby materiału na dzisiaj nie było za mało, pokażę jak skonfigurować projekt, aby skorzystać ze standardu JPA, którego API zastąpi nam Hibernate’a. Ten ostatni będzie dalej obecny pod postacią dostawcy implementacji JPA, jednak jak zauważymy później, kod źródłowy będzie całkowicie od niego niezależny. Przy okazji pokuszę się o małe porównanie JPA z Hibernate’m.

Zacząłem trochę inaczej niż zawsze, gdyż na wstępie zazwyczaj skupiam się na sensowności/celu zastosowania danej technologii, a nie na tym co będziemy robić. Jeśli czujesz się trochę zawiedziony, to już to nadrabiam :) Po co używać więc JPA, jeśli mamy w projekcie doskonale działającego Hibernate’a? Po co uczyć się nowego, nieco innego API? Czy użycie JPA ma jakieś zalety, ewentualnie wady? Odpowiedzi na te pytania mogą być różne i wszystko zależy od tego, jaką aplikację tworzymy i w jakim środowisku będzie ona pracować. Przede wszystkim należy pamiętać, że Hibernate nie jest jedynym narzędziem ORM’owym i istnieje cała masa alternatywnych rozwiązań. Możemy np. trafić do zespołu, który będzie faworyzował Oraclowego TopLink‚a, bądź rozwijanego przez fundację Apache – Open JPA. Możemy też być uzależnieni od środowiska, np. osadzenie aplikacji na serwerze Google App Engine będzie wymagało od nas użycia DataNucleus‚a.

Czytaj więcej »

Java 7 wydana!

Java Logo

Na stronie Oracle’a pojawiła się długo oczekiwana nowa wersja platformy języka Java. Do pobrania dostępne jest zarówno JDK jak i JRE w wersji 7-mej, a obsługiwane systemy operacyjne to Linux, Solaris i Windows.

Nowe wydanie przynosi szereg usprawnień do maszyny wirtualnej oraz kilka mniej i bardziej ważnych zmian w samym języku. Najważniejsze z nich opisałem już wcześniej korzystając z dostępnej wtedy wersji Developer Preview.

Jak Java 7 zostanie przyjęta przez programistów? – to się okaże, wydaje się jednak, że przejście będzie następowało nieco szybciej, niż w przypadku migracji do wersji 6-tej. Pozostaje tylko czekać na wsparcie nowej wersji języka przez najważniejsze serwery aplikacji oraz środowiska programistyczne.

To co, czekamy teraz na Javę 8? :)

Google Traffic w Polsce już jest!

To doskonała informacja dla wszystkich, którzy często korzystają z Google Maps do wyszukiwania pożądanej trasy. Najpopularniejsza dotychczas w Polsce usługa śledzenia natężenia ruchu na drogach – Targeo, ma kilka istotnych wad, jak chociażby wolne działanie czy brak nakładki mapy ze zdjęć. Od wczorajszej nocy dostępna jest godna uwagi alternatywa w postaci Google Traffic.

Google udostępniło nową usługę w 13-tu krajach w Europie. Dane o natężeniu ruchu uaktualniane są co około 5-10 minut i są prawdopodobnie zbierane z urządzeń posiadających system Android z uruchomioną funkcją lokalizacji użytkownika. Google Traffic działa zarówno w wersji webowej jak i mobilnej na Androidzie. Usługa pozwala na obserwowanie natężenia ruchu w chwili bieżącej oraz sprawdzenie prognozy dla danej godziny i dnia.

Więcej szczegółów o nowej usłudze można poznać w notce blogowej Google’a.

Alternatywa dla GWT-RPC: RequestFactory

Prawdopodobnie znasz już dobrze mechanizm GWT-RPC, który dostarcza podstawowy sposób komunikacji klient-serwer w projekcie wykorzystującym GWT. Mechanizm ten z powodzeniem działa już od pierwszych wersji GWT i mając z początku alternatywę jedynie w postaci ręcznych zapytań do serwletów http, wygrywa prawie każde starcie. Nie ustrzegł się jednak kilku dość istotnych wad (wynikających z ogólnej architektury aplikacji GWT), które nie tyle co coś uniemożliwiają, ale bardziej uprzykrzają życie programiście. O ile GWT-RPC w wywoływaniu prostych akcji sprawdza się świetnie, to implementacja dobrej warstwy pobierania danych jest już dość trudna. Problem leży w tym, że GWT nie potrafi zserializować obiektów encji wybieranych wprost z bazy danych poprzez np. Hibernate’a, które zawierają dowiązania do innych obiektów encji będących z nimi w relacji. W praktyce sprowadza się to do tego, że nie można stosować mapowań relacji typu „lazy”, gdyż informacje o relacjach przechowywane w obiektach encji nie mogą być zserializowane i przesłane do strony klienckiej. Relacje można więc sobie odpuścić (co jeszcze sprawdzi się w małej aplikacji), bądź przesyłać przez RPC obiekty specjalnych klas DTO (Data-Transfer Object), które będą zawierały jedynie niezbędne dla widoku informacje – a tu czeka nas ręczne i wolne przepakowywanie atrybutów obiektów oraz mozolne tworzenie klas DTO. Da się z tym żyć, jednak da się zrobić lepiej! Czytaj więcej »