Archiwa tagów: Java - Page 2

Relacja wiele-do-wielu i Criteria API w JPA 2.0

Jakiś czas temu zapowiadałem pojawienie się artykułu na temat relacji wiele-do-wielu zrealizowanej za pomocą RequestFactory w GWT. Od tamtej pory trochę wody w Wiśle upłynęło, a ja z braku czasu nie miałem kiedy napisać o swoich poczynaniach. Jako że miniony weekend znalazłem trochę czasu i spędziłem go pod znakiem GWT, postanowiłem nadrobić zaległości.

Zdecydowałem się jednak rozdzielić temat RequestFactory od tematu JPA i opisać te dwa zagadnienia osobno. Podyktowane jest to przede wszystkim chęcią rozpisania się trochę o tym pierwszym, a i w związku z JPA chciałbym przedstawić kilka ciekawostek. Materiału trochę jest, więc zebranie tego wszystkiego razem tylko wydłużyłoby czas oczekiwania na nowy wpis. Sam projekt, a raczej kontynuacja tego rozpoczętego przy pierwszych bojach z RequestFactory i rozwijanego dalej podczas opisu możliwości walidacji encji w JPA i GWT, jest już prawie na ukończeniu i można go pobrać z repozytorium.

Relacja wiele-do-wielu (many-to-many) jest chyba najtrudniejszą relacją do zamodelowania i zrozumienia dla początkujących programistów. Jako jedyna po stronie bazy danych wymaga utworzenia osobnej tabeli (tzw. intersekcji) łączącej rekordy dwóch głównych tabel. Z tego też powodu zazwyczaj sprawia najwięcej trudności przy mapowaniu tabel na encje za pomocą JPA (podobnie zresztą w czystym Hibernate). Upraszczając problem, relację wiele-do-wielu można rozłożyć na dwie relacje jeden-do-wielu (one-to-many) i dołożyć mapowanie osobnej encji pełniącej rolę intersekcji. Wtedy jednak w encjach głównych dostaniemy bezpośredni dostęp za pomocą kolekcji jedynie do encji intersekcji, a nie do siebie nawzajem. Jak więc poprawnie napisać mapowanie wiele-do-wielu używając adnotacji @ManyToMany?
Czytaj więcej »

Database Change Notification – odbieranie zdarzeń z bazie danych Oracle

Dzisiaj będzie krótko, bo w związku ze zmianą mojego Centrum Dowodzenia (czyt. mieszkania) mam ostatnio trochę mało czasu i dużo gratów na głowie :) Będzie o tym, w jaki sposób w aplikacji napisanej w Javie odbierać zdarzenia z bazy danych Oracle. Po co to robić? Ano czasami trzeba, np. gdy duża część logiki biznesowej siedzi już w procedurach na bazie i nie ma szybkiego sposobu, żeby się jej pozbyć, albo mamy kilka aplikacji korzystających z tej samej bazy i nie mamy innego sposobu niż baza na zapewnienie komunikacji między nimi. W każdym bądź razie kiedyś musiałem takiego potworka zrobić i pomyślałem, że się tym podzielę.

Muszę też zaznaczyć, że jeśli tworzysz aplikację od nowa, bądź masz nieco możliwość wyboru rozwiązania, nie czytaj dalej. Użyj JMS, wywołuj zdarzenia po RMI, zrób cokolwiek byle nie to. Potraktuj bazę danych jako składnicę danych i nic więcej – ułatwisz życie sobie i innym, którzy mają utrzymywać później Twój kod. Zapytasz dlaczego? Po pierwsze nie ma jednego uniwersalnego sposobu na otrzymywanie zdarzeń z bazy (no chyba że w grę wchodzi cykliczne odpytywanie) i jest on zależny od danego dostawcy bazy danych. Po drugie, nie wszystkie bazy danych taki mechanizm mają. Po trzecie, może okazać się, że implementacja tego mechanizmu nie jest doskonała i napotkamy szereg problemów przy jej wdrożeniu. Jeśli już naprawdę potrzebujesz takiego rozwiązania, chcę Ci zaprezentować mechanizm Database Change Notification w bazie danych Oracle.

Czytaj więcej »

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? :)

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 »

Szyfrowanie danych w bazie danych za pomocą Jasypt + Hibernate

Jasypt Logo

Bezpieczeństwo danych przechowywanych w naszej aplikacji polega nie tylko na należytym zabezpieczeniu ekranu logowania oraz implementacji dobrego mechanizmu uwierzytelniania i autoryzacji użytkowników. Te dwa ostatnie zagadnienia można zrealizować chociażby przy pomocy certyfikatu SSL i usługi JAAS. Czasami wymaga się jednak, aby same dane były składowane w formie zaszyfrowanej. Najczęściej stosuje się tą metodę, jeśli dostęp do bazy danych może być uzyskany w jakikolwiek inny sposób, niż przez naszą aplikację. Odpowiednio zaimplementowany mechanizm zabezpiecza też dane w bazie przed nieautoryzowanym dostępem za pomocą potencjalnych luk w zaufanej aplikacji.

Szyfrowanie danych w bazie można zrealizować na wiele sposobów. Jednym z nich jest po prostu dopisanie do getterów i setterów naszych klas encji odpowiednich operacji szyfrowania i deszyfracji. Od stopnia zaawansowania poziomu zabezpieczenia zależy, jak duży bałagan w kodzie zrobimy i jak ciężko będzie to utrzymać. Z pomocą przychodzą biblioteki, które pozwalają na przeźroczyste szyfrowanie danych na poziomie np. Hibernate’a. Jedną z takich bibliotek jest Jasypt – narzędzie upraszczające operacje szyfrowania do niezbędnego minimum (przy czym oferujące równie zaawansowane możliwości, co API JCE – Java Cryptography Architecture). Jasypt doskonale sprawdza się w implementacjach własnych mechanizmów szyfrowania oraz integruje się z wieloma popularnymi technologiami jak Hibernate, Spring, Wicket czy JBoss Seam. Sam z siebie nie dostarcza żadnych algorytmów szyfrowania, jednak pozwala na dołączanie dodatkowych dostawców JCE umożliwiających korzystanie z bardziej zaawansowanych algorytmów jak AES czy WHIRLPOOL.

Czytaj więcej »

Tworzenie stron mobilnych w JQuery Mobile i GWT

Aplikacje oraz strony internetowe tworzone pod urządzenia mobilne zdobywają coraz większą popularność. Wzrastająca liczba urządzeń wraz z zwiększającymi się stale możliwościami umożliwiają projektowanie ładnych, dynamicznych interfejsów użytkownika. Na rosnące zapotrzebowanie odpowiedzią są liczne frameworki ułatwiające tworzenie mobilnych stron i aplikacji. Część z nich przeznaczona jest na pojedyncze platformy (jak iOS), niektóre pozwalają budować aplikacje wieloplatformowe. Sencha Touch, PhoneGap, Rhodes, JQuery Mobile, to tylko niektóre z nich. Niestety zdecydowana większość to biblioteki JavaScript’owe i tylko niewiele z nich się pod tym względem wyróżnia.

Jako że tematyką blogu jest głównie GWT, postanowiłem sprawdzić, czy istnieją już gotowe rozwiązania umożliwiające na pisanie stron mobilnych w Javie. Na pierwszy ogień poszła Sencha Touch, z tego względu iż na co dzień wykorzystuję bibliotekę Ext GWT tej samej firmy, która to wywodzi się z biblioteki Ext JS napisanej w JavaScripcie. Pomyślałem, że może firma zrobi ten sam manewr z Sencha Touch i przepisze swoją JavaScriptową bibliotekę na Javę. Niestety takiej implementacji nie znalazłem, jednak na forum Senchy można zaobserwować rosnący ruch zwolenników GWT czekających na taką wersję. Rokowania na przyszłość są, bieżących rozwiązań nie ma.

Czytaj więcej »

Implementacja Comet’a w GWT, czyli jak poradzić sobie z Atmosphere’m

W dobie dzisiejszych aplikacji webowych często wykorzystywanym rozwiązaniem jest technika „Server Push„, występująca również pod nazwą „Comet„. Jest to technika pozwalająca na sprawne przesyłanie komunikatów w kierunku serwer -> klient (przeglądarka). Jak zapewne wiesz, protokół HTTP nie umożliwia przesyłania danych w tą stronę bez zainicjowania połączenia ze strony klienta. Na jakiej zasadzie działa więc Comet? Istnieje kilka popularnych rozwiązań tego problemu.

Najprostszą i najmniej wydajną implementacją jest po prostu cykliczne odpytywanie serwera w celu sprawdzenia, czy istnieją na serwerze nowe komunikaty, jeśli tak to są one zwracane wraz z odpowiedzią zapytania. Jak można się domyślić, odpytań będzie dużo, tym więcej im więcej użytkowników połączy się z aplikacją. Można nieco usprawnić ten mechanizm wprowadzając po stronie serwera pewien czas oczekiwania na nowe komunikaty, jednak nadal dużym narzutem będą same nagłówki HTTP odpytań serwera.

Można też skorzystać z technologii typu Adobe Flash, czy Aplety Java. Za ich pomocą można w łatwy sposób zbudować komunikację serwer -> klient, jednak trzeba się liczyć z tym, że przeglądarka użytkownika nie będzie ich obsługiwała. O ile Flash’a jeszcze da się przeżyć, to aplet Javy może skutecznie zniechęcić użytkownika do dalszego oglądania naszej strony. Często jednak wymagania projektu wykluczają też użycie Flasha, czy innych technologii nie obsługiwanych natywnie przez przeglądarkę, musimy skorzystać więc z innego rozwiązania.

Czytaj więcej »

Zapamiętywanie i walidacja danych w formularzu logowania GWT + JAAS

Widząc rosnące zainteresowanie tematyką bezpieczeństwa w GWT, postanowiłem jak najszybciej dostarczyć Ci kolejną przydatną dawkę informacji. Pamiętasz pewnie wpis o uwierzytelnianiu i autoryzacji w GWT – powstał wtedy mały projekt pokazujący, w jaki sposób połączyć aplikację napisaną w GWT z autoryzacją poprzez mechanizm Javy, a dokładniej użyliśmy JAAS (Java Authentication and Authorization Service). Tamten projekt miał jednak pewne wady, m. in. brak walidacji danych na formularzu logowania oraz nie obsługiwał zapamiętywania tych danych przez przeglądarkę. Pierwszy problem wynikał z użycia przycisku „submit”, który automatycznie wysyłał formularz, nie było więc momentu na sprawdzenie poprawności wysyłanych danych. Natomiast drugi problem jest bardziej złożony i związany z naturą samego GWT. W poszukiwaniu rozwiązania będziemy więc kontynuowali rozpoczęty wcześniej projekt.

Przeszukałem najpierw zasoby internetu, aby sprawdzić, czy występują już jakieś znane rozwiązania wyżej wymienionych problemów. Praktycznie wszystkie przykłady implementacji formularza logowania używają GWT RPC do przesyłania danych, więc nie było w czym przebierać. Jeśli zaś chodzi o zapamiętywanie danych logowania, problemem jest brak bezpośredniej możliwości skorzystania z mechanizmów przeglądarki, bo do tego potrzebny jest formularz wraz z polami loginu i hasła oraz przyciskiem „submit”, który musi znajdować się bezpośrednio w pliku html, a żaden z jego elementów nie może być wstrzykiwany javascript’em. Wszystkie moduły GWT są wstrzykiwane javascript’em w treść strony, dlatego przeglądarka nawet nie proponuje możliwości zapamiętania danych. Czytaj więcej »

Nowości w Java 7

Java w wersji 7 zbliża się wielkimi krokami, choć idzie jej to bardzo powoli. Termin wydania pełnej wersji był już kilkukrotnie przekładany, co wynikło również z faktu przejęcia firmy Sun przez Oracle’a. Postanowiono również rozłożyć w czasie wydanie pewnych nowych funkcji języka, dlatego część z nich ukaże się dopiero w wersji 8-mej. Jako że niedawno ukazał się kolejny kamień milowy (M12) 7-ki, który zawiera pełną funkcjonalność nowej wersji języka, a w internecie jest już sporo nieaktualnych informacji o nowościach, jakie mają się w niej ukazać, postanowiłem napisać kilka szczegółów na ten temat.

Zaczęło się od tego, że zainstalowałem dzisiaj środowisko IntelliJ IDEA. Eclipse czasem mnie drażni, ale o konfrontacji tych dwóch IDE opowiem innym razem. Po otworzeniu istniejącego projektu w pierwszej kolejności postanowiłem pogrzebać trochę w opcjach. Tak też dotarłem do ustawień struktury projektu, gdzie obok wyboru SDK można było sprecyzować, jakiej wersji języka chcemy używać. Co ciekawe, przy każdej wersji IDEA wypisuje kilka słów kluczowych związanych z danym wydaniem. Przy wersji 7-mej były to: „Diamonds”, strings in switch, etc. Jako że do tej pory nie byłem na bieżąco z nową Javą, postanowiłem to nadrobić i zobaczyć, co ciekawego kryje się w Javie 7.

Czytaj więcej »