Chcę sobie dla ćwiczeń napisać prostą aplikację serwerową (EJB + JPA + baza danych (JNDI)) i aplikację kliencką która realizowałaby pewne działania na bazie właśnie przez aplikację serwerową (jej metody). Nie mam w tym żadnego doświadczenia dlatego chciałem zapytać o podstawowy schemat działania czegoś takiego.
Opiszę moje (2) propozycje tego procesu.
Założenia są takie że klient, za pośrednictwem serwera, ma mieć możliwość wyszukiwania rekordów z danej tabeli bazy (np. Produkty) podając pewne kryteria (np. dotyczące nazwy produktu (jakiś Select z warunkiem dla nazwy)). Tabela ma pole @Version do sprawdzania Optimistic Locka aby zapobiec równoległym updateom.
*pyt 1 (najważniejsze). Czy aplikacja EJB powinna Selectować obiekty encji czy same pola z rekordów? Załóżmy że rekordów jest bardzo dużo (setki) i zapytanie może dać wiele wyników więc nagle musiałoby powstać w Persistence Context wiele obiektów encji a potem trzeba by je przesłać do klienta. Wydaje się to bardzo czasochłonne. Tymbardziej że zaraz po zakończeniu tej selectujacej metody w EJB wszystkie te encje byłby automatycznie oderwane od Persistence Context *
Następnie serwer zwraca klientowi listę wybranych rekordów (pola lub obiekty encji). Z wyświetlonej listy klient wybiera sobie jakąś pozycję którą np. chce zmodyfikować.
Opcja 1
Jeżeli do klienta została wysłana kolekcja obiektów encji (co wydaje mi się nieekonomiczne) to dalsze działanie jest proste. Klient zmienia pola obiektu encji, wywołuje metodę zapisującą która wysyła wybrany obiekt encji do aplikacji EJB, ta przy mergowaniu sprawdza pole @Version i jeżeli jest poprawna wartość to na koniec spłukuje zmiany do bazy i commituje je.
Opcja 2
Jeżeli klient dostał od serwera listę danych z pól rekordów (wynik zapytania o wartości pól - krotki) to są one w postaci Object[]. załóżmy, że są one również wyświetlane po jego stronie jako lista rekordów. Klient wybiera jeden z nich do modyfikacji, modyfikuje dane i wywołuje metodę EJB z tymi danymi jako parametrami. Metoda EJB tworzy konstruktorem obiekt encji z otrzymanych danych, ustawia wartość pola Version którą też otrzymała od klienta (a on z kolei z pierwszego zapytania) i merguje obiekt encji. Jak nie ma konfliktu Optimistic Locka to zmiany zostają zapisane do bazy.
- Która opcja jest bardziej poprawna?*
P.S.
Macie może linka z opisami przyjętych szablonów programowania podobnych aplikacji?