Relacja wiele-do-wielu i Criteria API w JPA 2.0
Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /usr/home/avd/domains/yuppy.pl/public_html/wordpress/wp-content/plugins/prettify-gc-syntax-highlighter/prettify-gc-syntax-highlighter.php on line 63
Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /usr/home/avd/domains/yuppy.pl/public_html/wordpress/wp-content/plugins/prettify-gc-syntax-highlighter/prettify-gc-syntax-highlighter.php on line 69
Skomentuj
Ciekawa sprawa z tym metamodelem. Dzięki za info, nie natrafiłem na to wcześniej. Spróbuję wykorzystać w projekcie, który akurat tworzę „po godzinach” ;), wykorzystuję w nim właśnie między innymi JPA (w implementacji Hibernate). Pzdr.
Tu możesz zobaczyć pom’a:
http://websvn.avd.pl/wsvn/yuppy/projects/trunk/sample-gwt-requestfactory/pom.xml
Użyłem pluginu maven-processor-plugin i build-helper-maven-plugin.
Jeśli używasz Hibernate, to jako dependency trzeba dopisać:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>1.1.1.Final</version>
</dependency>
Nie wiem tylko, czy da się jakoś połączyć konfigurację maven’a z eclipse’m, żeby sam załapał, że trzeba dołączyć nowy katalog ze źródłami metamodeli. Musiałem ręcznie włączyć w eclipse przetwarzanie adnotacji i wskazać odpowiedni katalog, a chciałbym jakąś ten krok pominąć
Dzięki. Ja od kilku miesięcy używam IntelliJ IDEA, więc będą kombinował z nią, ale jak na razie jestem pozytywnie zaskoczony jej użytecznością, szybkością i mnogością automagicznych ficzerów
(typu np. znalazłam konfigurację połączenia do bazy w projekcie, to połączę się i będę podpowiadać Ci strukturę tabel itp.). Polecam
Jak wygram licencję na IDEE na którymś WJUG’u, to też się chętnie przesiądę
Eclipse niestety momentami zdycha…
W każdym bądź razie z tego co wynika z dokumentacji Hibernate Metamodel Generator, zarówno Eclipse jak i IDEA wspierają automatyczne przetwarzanie adnotacji. NetBeans’a trzeba by było sprawdzić, ponoć od wersji 7 też już takie wsparcie zawiera.
To ja polecam wam zapoznać się jeszcze z Hadesem.
A po co? Ano po to, że stworzenie prostego dao z przykładową metodą listowania meetings z wpisu plus przykładowe pobranie meetingów o danej nazwie sprowadza się do:
public interface MeetingDao extends GenericDao {
@Query(„from Meeting m where m.members..id = :carId”)
public List listByCarId(@Param(„carId”) Long carId);
public List findByName(String name);
}
I nic więcej. Żadnych metamodeli, żadnych wielkich Dao, żadnych criteria do prymitywnych prostych zapytań. A to jeszcze nie wszystko. Spokojnie wystarczy do wielu zastosowań a pełni funkcjonalne dao (z paginacją i specyfikacją) dla encji to powyższe kilka linijek.
Hades, to tylko pewna gotowa implementacja GenericDao, korzystająca pod spodem z JPA – nic więcej. Co najgorsze, wymaga Springa, a nie wszyscy muszą chcieć go używać
W artykule raczej nie chodziło mi o to, żeby wszystko pokazać w najprostszy możliwy sposób. Owszem, definiowanie zapytań w Hadesie, JPQL’u (z którego Hades pewnie też korzysta), HQL’u, czy nawet czystym SQL’u będzie często łatwiejsze, niż posługiwanie się Criteria API. Jednak nie wyobrażam sobie np. implementacji dynamicznego filtrowania poprzez sklejanie stringów, tu po prostu Criteria są wygodniejsze. Pomijając fakt, że ja po prostu bardziej lubię Criteria, niż wszelakie *QL’e.
Przeglądając sieć na temat utworzenia zapytania w Criteria API do przeszukiwania obiektów połączonych intersekcją na prawdę nie znalazłem wielu przykładów, ani tym samym w 100% trafnych odpowiedzi. Dlatego zdecydowałem się na umieszczenie tutaj takiego zapytania. Człowiek przede wszystkim uczy się na prostych rzeczach.
Wiem czym jest Hades. A dla jasności, to nie musisz w nim polegać tylko na JPQL. Masz też api do dynamicznego filtrowania.
A tak z innej beczki to szkoda, że ludzie odchodzą od SQL do API…Nie wiedziałem też, że nie można w komentarzu wskazać na inne (mym skromnym zdaniem – ciekawe) rozwiązanie bo nie do końca pokrywa się z ideą autora postu
Tobie może się nie przyda, ale być może ktoś nie będzie chciał pisać criterii, metamodeli… i wystarczy mu zwykłe dao.
Oczywiście, że można komentować w taki sposób i można wskazywać alternatywne rozwiązania – nigdzie nie napisałem, że nie jest to na miejscu
Czytelnicy jak najbardziej powinni wiedzieć, że wiele problemów można rozwiązać na wiele różnych sposobów, a ja tylko wybrałem jeden z nich i właśnie ten zaprezentowałem. Moja wcześniejsza wypowiedź miała raczej za zadanie pokazać, że można to zrobić za pomocą Criteria API, bo ja w zasadzie myślę trochę przeciwnie: zbyt mało ludzi używa Criteria w porównaniu do *QL’i i nie są w stanie docenić wielu zalet, jakie niesie te API.
> Metamodele sprawdzają się o wiele lepiej od niepewnych ciągów znaków, w końcu właśnie po to zostały stworzone. Szkoda tylko, że nie da się ich użyć po stronie klienckiej GWT, gdyż nie ma ich implementacji javascript’owej.
Podobnym rozwiązaniem są w gxt3.0 interfejsy ValueProvider
Ogólnie w czystym GWT AutoBean’y opierają się na takich ValueProviderach (nazywa się to trochę inaczej, ale o to samo chodzi), a GXT korzysta właśnie z tych rozwiązań GWT’owych. Choć i tak nie da się w niektórych miejscach uniknąć zaszywania nazw kolumn w stringach (chociażby przy jakimś generycznym mechanizmie sortowania i wyszukiwania na gridach), a przynajmniej tak jest w GWT, bo nie wiem jak zostało to rozwiązane w nowym GXT.