Criteria API multiselect i różnice w implementacjach JPA

Tworzenie zapytań w JPA to rzecz zarazem łatwa jak i trudna. Łatwa, bo bardzo prosto jest stworzyć zapytanie oparte o zwykłego SQL’a lub JPQL’a, a nawet zapytania tworzone za pomocą Criteria API nie są czymś nadzwyczajnym. Zarazem jest to jednak trudny temat, bo trzeba pamiętać o wielu kwestiach związanych z wydajnością lub bezpieczeństwem, których pominięcie może spowodować spore problemy w przyszłości. Nie chcę tu się rozpisywać po trochu o wszystkim, a poruszyć jeden temat, który zaciekawił mnie szczególnie.

Jedną z ważniejszych rzeczy związanych z projektowaniem zapytań do bazy danych jest zawężanie zapytań w taki sposób, aby zwracały tylko niezbędne do konkretnego widoku aplikacji dane. Gdy używamy technologii ajaxowych (np. GWT), ogranicza to nam ilość przesyłanych danych do przeglądarki, a nawet jeśli nie, to mniej cierpi na tym serwerowy cache (jeśli go włączyliśmy). JPA dostarcza kilka rozwiązań, które umożliwiają zawężenie wyników zapytań, a ciekawsze z nich to Constructor Expression wykorzystane wraz z Named Queries, oraz multiselect w Criteria API. Ciekawsze, bo oba pozwalają zmapować zapytanie bezpośrednio na konstruktor klasy DTO. Dziś będzie o tylko o tym drugim, czyli o metodzie multiselect.

Czytaj więcej »

Opera 12 + Chrome = Opera 15

opera-logo

Jakiś czas temu Opera Software zapowiedziało rozwój nowej gałęzi swojej przeglądarki opartej o silnik Blink. Sądzę, że podyktowane to było między innymi zbyt dużymi nakładami pracy wkładanymi w rozwój własnego silnika Presto, który wymagał już wielu gruntownych zmian w przystosowaniu go do obsługi wszelkich nowych standardów. Skorzystanie z gotowego silnika (używanego także przez przeglądarkę Chrome) pozwoli skupić się im na rozwoju samej funkcjonalności przeglądarki, czyli tego, co wyróżniało zawsze Operę od innych.

Opera Software właśnie opublikowała nową wersję swojej przeglądarki, oznaczonej tym razem numerkiem 15. Jak więc sprawdza się Opera z nowym silnikiem? Czy podmiana silnika wyszła jej na dobre? Odpowiedź na to pytanie jak zwykle nie jest taka prosta :)

Czytaj więcej »

Co zrobić, by Git wciąż nie pytał o hasło?

Jakiś czas temu przerzuciłem się z prawie wszystkimi swoimi repozytoriami na Git‚a. O przewagach Git’a nad SVN‚em można mówić wiele, jest też jednak kilka drobnych bolączek, z którymi SVN radził sobie świetnie, a Git wciąż nie daje sobie z nimi rady. Dziś będzie krótko o jednej z nich.

Git’a używam głównie na Windowsie (msysgit). Czasem pod konsolą, jednak głównie posiłkuję się TortoiseGit‚em – wcześniej pracowałem dużo na TortoiseSVN’ie, więc górę wzięły przyzwyczajenia :) Z repozytoriami Git’a łączę się głównie przez protokół http/https, gdyż bawienie się certyfikatami ssh na Windowsie do najprzyjemniejszych nie należy – kilka razy próbowałem, zawsze był jakiś problem. Natomiast przy jakichkolwiek próbach połączenia się przez http Git za każdym razem pytał mnie o login i hasło do repozytorium. Bez jakiejkolwiek możliwości zapamiętania wprowadzonych raz danych.

Rozwiązaniem bolączki okazała się aplikacja git-credential-winstore, wpinająca się w API uwierzytelniania Git’a i wykorzystująca poświadczenia systemu Windows. Po jej zainstalowaniu przy próbie połączenia się z repozytorium, wyświetlone zostało systemowe okno uwierzytelniania, oczywiście z opcją zapamiętania poświadczeń. Wprowadzonymi poświadczeniami możemy dodatkowo zarządzać z poziomu systemu: Panel sterowania\Wszystkie elementy Panelu sterowania\Menedżer poświadczeń.

Jeśli masz więc dość ciągłego pytania Git’a o login i hasło do Twojego repozytorium, zainstaluj git-credentials-winstore. Gdybyś napotkał na problemy z instalacją, pobierz plik instalacyjny i uruchom go z uprawnieniami administratora.

Do czego służą światła w samochodzie?

Do napisania tego artykułu natchnęło mnie po ostatniej podróży samochodem z Mazur do Warszawy. Już dawno przymierzałem się do tego, aby popełnić wpis o pewnych zagadnieniach związanych z jazdą po naszych drogach, bo pewne dręczące mnie sprawy zbierały się już od dłuższego czasu. Generalnie teraz nie jeżdżę tyle co dawniej (po zakupie samochodu miałem manię jeżdżenia wszędzie i kiedy się tylko da) i na ogół przyjmuje wszelakie zachowania pseudo-kierowców dość spokojnie, jednak po weekendowej podróży miałem już wszystkiego dość.

Weekend był mglisty chyba w całym kraju, ale oprócz tego warunki jezdne były całkiem dobre. Mimo wszystko dawno nie wróciłem z trasy tak zmęczony, głównie z powodu oślepiających mnie co chwilę kierowców jadących z naprzeciwka (i nie tylko) z zapalonym czym się tylko da. Zastanawiam się ilu jeżdżących po naszych drogach kierowców zna przepisy ruchu drogowego dotyczące przede wszystkim oświetlenia i zdaje sobie sprawę z konsekwencji nieprawidłowego ich użytkowania. Niestety odnoszę wrażenie, że jest ich niewielu. Tu już nawet nie chodzi o zapamiętanie regułek słowo w słowo, tylko o zdrowy rozsądek i zastanowienie się, czy swoim zachowaniem nie stwarzamy zagrożenia innym uczestnikom drogi.

Czytaj więcej »

Dwa dni z Pintą

pinta-logo

Niedawno miałem okazję spróbować kilku piw z mało znanego, niewielkiego browaru o wdzięcznej nazwie Pinta. Jest to jeden z niewielu działających na terenie Polski browarów kontraktowych, który swoje piwa warzy obecnie w Browarze na Jurze. Browar dość młody, bo założony nieco ponad rok temu, przez co nie jest zbytnio znany. Sam dowiedziałem się o jego istnieniu zaledwie kilka dni temu, pomimo tego, że lubię przeszukiwać półki sklepowe z piwami regionalnymi i niszowymi.

W ofercie Pinty znalazło się wiele gatunków piwa, potrafiących zaskoczyć swoim smakiem, aromatem i… wyglądem :) niejednego piwosza. Przy pierwszym kontakcie wzrokowym piwo zachęcało do kupna samą swoją etykietą, niestety odstraszyło nieco ceną. Wpadło jednak w oko i po krótkim przeglądzie internetu wiedziałem, że muszę tego piwa spróbować :) Tak też dnia następnego wpadło w moje ręce pięć przedstawicieli Pinty, których konsumpcję musiałem rozłożyć na dwa dni, obawiając się utraty czucia smaku przy dłuższej degustacji :)

Czytaj więcej »

O Warsjawie 2012 słów kilka

wjug-logo

Dnia dzisiejszego odbyła się konferencja warsztatowa Warsjawa 2012. Obecnie jest to chyba największa tego typu konferencja w Polsce, która z roku na rok przyciąga coraz większą ilość uczestników i prelegentów. W tym roku można było zapisać się na jedną z 10 ścieżek warsztatowych, z których większość dotyczyła tematów około-javowych, ale znalazło się też kilka traktujących o zupełnie innej tematyce. Zapisywać na warsztaty trzeba było się dość szybko, bo miejsca zostały obsadzone zaledwie w przeciągu kilku dni. Mi dane było udać się na ścieżkę: Injektowanie zależności w GUICE + zdalne injektowanie, więc to z jej punktu widzenia zdam relację z konferencji :)

Na początek duża pochwała dla organizatorów, bo organizując takie konferencje robią coś naprawdę wspaniałego. Miło jest patrzeć, jak społeczność javowa w Polsce stale się rozwija i skupia wokół siebie coraz większe zainteresowanie. Nie byłem na poprzednich edycjach Warsjawy, więc ciężko mi jest porównać do nich dzisiejsze wydarzenie, jednak dziś odbyło się wszystko bez wpadek, większych problemów i obsunięć czasowych, za co należy się duży plus. Spory minus za to dla samej społeczności, bo odniosłem wrażenie, że sporo osób dziś nie dotarło (zima ich zaskoczyła?), nie informując organizatorów o tym wcześniej, przez co przyblokowali miejsca dla innych potencjalnych chętnych uczestnictwa.

Czytaj więcej »

Co nowego w GWT 2.5?

Logo GWT

Ostatnimi czasy wydawać by się mogło, że ekipa Googla nieco spowolniła i dość długo kazała nam czekać na kolejne wydania GWT. Rzeczywiście dawniej nowe wersje pojawiały się zdecydowanie częściej i częściej też wprowadzały nowe, ciekawe rozwiązania. W sieci pojawiły się też głosy, że GWT staje się martwe, między innymi za sprawą języka Dart. Ludzie pracujący nad GWT dość szybko rozwiali jednak te wątpliwości i zapowiedzieli wersję 2.5, która przynosi nową, ciekawą funkcjonalność i ponownie wprowadza nieco świeżości w tą znakomitą bibliotekę. Od tamtej pory pojawiły się już dwa wydania kandydujące oznaczone odpowiednio RC1 i RC2, a na finalną wersję przyszło nam jeszcze trochę poczekać.

Od jakiegoś czasu systematycznie przyglądałem się zmianom wprowadzanym na repozytorium GWT, które zwiastowały coraz szybsze nadejście nowej wersji. Tak też się stało, bo zaledwie kilkanaście godzin temu wersja oznaczona numerkiem 2.5 stała się dostępna do pobrania! Czego więc nowego można się spodziewać? Czy warto jak najszybciej przenosić się ze sprawdzonej wersji 2.4?

Czytaj więcej »

Atmosphere Framework 1.0.0 już jest!

Po prawie 4 latach intensywnej pracy Jeanfrancois Arcand w końcu wydaje bibliotekę Atmosphere Framework w wersji 1.0.0! Ciężko tu przytoczyć listę zmian, jakie weszły w skład nowego wydania, bo autor Atmosphere’a nie prowadzi jakiegoś konkretnego changelog’a (mam nadzieję, że takowy pojawi się wraz z kolejnymi wydaniami), a jego rolę pełni obecnie spis zamkniętych zgłoszeń na github’ie. Najważniejsze jest jednak to, że osiągnięto pewny kamień milowy, który pozwala spokojnie stwierdzić, że Atmosphere jest na tyle dojrzały aby używać go produkcyjnie. W ostatnich wydaniach skupiono się przede wszystkim na poprawkach błędów i wzroście wydajności.

Dla niewtajemniczonych, Atmosphere jest biblioteką umożliwiającą wdrożenie architektury Comet w naszym projekcie. Dlaczego warto go stosować? Bo jest chyba jedyną biblioteką wspierającą tak wiele serwerów aplikacji oraz przeglądarek. Warto tu wymienić chociażby wsparcie dla serwerów Jetty, Tomcat, GlassFish, WebLogic, WepSphere czy JBoss oraz wszystkich najpopularniejszych przeglądarek (tabela kompatybilności znajduje się tutaj). Atmosphere działa tak, że sam wykrywa, w jakim środowisku został uruchomiony i jakie technologie przesyłania danych możliwe są do użycia (zarówno po stronie serwera jak i klienta). Nawet jeśli nie będą dostępne WebSockety, HTTP Streaming, czy inne natywne rozwiązania danego serwera, Atmosphere i tak będzie działać (korzystając z własnej implementacji)! Kod wystarczy napisać więc raz, a resztę możemy spokojnie zrzucić na barki tej biblioteki.

Atmosphere wspiera też dużo popularnych rozwiązań takich jak GWT, PrimeFaces, Apache Wicket, Vaadin, Grails, RichFaces, Scalatra, Apache Tuscany, JQuery-Socket oraz bardzo dobrze współpracuje ze Spring’iem i Guice’m. Jeśli używasz więc którejś z tych technologii i chcesz wdrożyć Comet’a, nie wahaj się, użyj Atmosphere’a!

Aktualizacja projektów na repozytorium

Zaktualizowałem wszystkie projekty stworzone na potrzeby artykułów na blogu, aby używały najnowszej wersji GWT (obecnie jeszcze 2.4.0). Korzystając z okazji, w projekcie dotyczącym implementacji architektury Comet zaktualizowałem bibliotekę Atmosphere do najnowszej dostępnej wersji 1.0.0.RC1 (już za kilka dni prawdopodobnie ukażę się wersja finalna) oraz do projektu przedstawiającego użycie XForms’ów dołączyłem nową wersję biblioteki EMC Formula 1.3.6. Te aktualizacje wymagały kilku drobnych zmian w kodzie projektów, więc jeśli z nich już korzystałeś, zachęcam do zapoznania się z najnowszą wersją, która znajduje się na repozytorium.

Przymierzam się też do zmiany systemu kontroli wersji na GIT’a, którego to już od dłuższego czasu używam przy innych projektach i który z powodzeniem zastępuje mi wysłużonego już nieco SVN’a. Już niedługo możesz się więc spodziewać kilku zmian :)

Jak działa RequestFactory w GWT?

Jakiś czas temu pisałem na temat alternatywnego mechanizmu komunikacji klient-serwer w GWT, jakim jest RequestFactory. Omówiliśmy wtedy podstawy – zaimplementowaliśmy generyczną klasę DAO i wykonywaliśmy proste operacje CRUD. Przy okazji artykułu na temat JPA i walidacji encji pokazałem, jak w prosty sposób przeprowadzić walidację encji i zintegrować to z RequestFactory. Podczas omawiania relacji wiele-do-wielu i zapytań poprzez Criteria API w JPA 2.0 rozbudowaliśmy projekt wykorzystujący RequestFactory, jednak wtedy nie skupialiśmy się na części klienckiej, gdzie wykorzystywany jest tytułowy mechanizm. W żadnym z tych artykułów nie pisałem jednak na temat zasad działania RequestFactory, a domyślam się, że jesteś ciekaw jak to wszystko chodzi. W niniejszym wpisie chciałbym się skupić właśnie na stronie technicznej.

RequestFactory jest mechanizmem wprowadzonym w GWT 2.1 w celu dostarczenia alternatywy dla GWT-RPC. Alternatywy, dlatego że GWT-RPC dalej pozostaje podstawowym i najprostszym sposobem komunikacji klient-serwer, które nie jest jednak pozbawione kilku wad. RequestFactory jest przede wszystkim zorientowane na pobieranie danych (data-oriented) i doskonale integruje się z framework’ami bazodanowymi takimi jak np. Hibernate. Implementuje też walidację encji według normy JSR 303. Tak naprawdę mechanizm nadaje się do użytku od GWT 2.1.1, w której wprowadzono szereg udoskonaleń. W następnych wersjach pojawiały się mniejsze poprawki, zostały też zmienione pakiety wszystkich klas na mniej związane z samym GWT (z com.google.gwt na com.google.web.bindery), co sugeruje, że być może kiedyś zostanie wykorzystane poza GWT. W tym artykule opieram się na RequestFactory, jakie jest w GWT 2.4.

Czytaj więcej »