JPA - jak zrobić refresh all?

0

Oczywiście wiem już teraz, że źle się do tego zabrałem, ale nie mam czasu i muszę to "jakoś" zrobić na teraz, później będę poprawiał. Więc proszę o pomoc jak moje rozwiązania teraz "załatać", aby tylko działało, ale też dobrze jakbyście wskazali prawidłowy kierunek mi na przyszłość.

Korzystam z JPA(eclipselink|mysql) + VAADIN na Tomcacie bez Springa, EJB etc. (tak kazano mi projekt dalej realizować).

Mam jeden entityManager na całą aplikację (kolejna wytyczna), korzystam tylko z transakcji czyli jak cokolwiek chcę zapisać do bazy usunąć, dodać, zmodyfikować, to robię to między em.getTransaction.begin() i em.getTransaction.commit().
I tutaj największy problem. Oczywiście jak coś zmieni jeden uzytkownik, to drugi ma w tym momencie nieaktualne dane i trzeba robić em.refresh(entityObject), aby zaczytał z bazy dane na nowo. Nie korzystam domyślnie raczej z L2 Cache, więc entityManager.getEntityManagerFactory().getCache().evictAll(); nic nie da. A entityManager.clear(); rozwiązuje u mnie sprawę, z tym, że obiekty pobrane tracą połączenie z entity managerem i zmiana lub commit do bazy nie dojdzie. Sprawę rozwiązałoby gdyby istniało coś jak .refreshAll(). Co prawda byłby to narzut spory, ale w tej aplikacji to nie boli i w przyszłości to zmienię na inne rozwiązanie.

Da się w ogóle aplikacje rozsądnie z JPPA pisać bez żadnych dodatków jak spring, EJB itd. na tomcacie?

0

Czyli chcesz, zeby drugi uzytkownik, ktory jest w trakcie edycji czegostam, w momencie jak jakis inny wczesniej cos zapisze, straci swoja lokalne edycje i na sile zostanie odswiezona jego wersja encji?

0

Nie,chcę w kontrolowanych miejscach odświerzyć wszystko. Czyli np. podczas przechodzenia po stronach, gdy wejdzie w edycję czegoś to widzi najświerzsze, aktualne informacje. Ale później już podczas zmian do momentu kliknięcia Save albo Abort pracuje na swojej lokalnej wersji obiektu. Nie chcę, by strona z danymi odświerzała się w dowolnym momencie, tylko chcę to zrobić w konkretnych momentach w aplikacji, gdzie to będzie rozsądne.

0

Byłbym wdzięczny za odpowiedź, bo temat dla mnie dość istotny.

0

Mam jeden entityManager na całą aplikację (kolejna wytyczna), nie rozumiem naprawde jeden???
Bo jak jeden to problem nie powinien istnieć session level 1

0
Szczery napisał(a):

Mam jeden entityManager na całą aplikację (kolejna wytyczna), nie rozumiem naprawde jeden???
Bo jak jeden to problem nie powinien istnieć session level 1

Uściślając jeden na sesję, a nie jeden dla wszystkich zalogowanych użytkowników.
Faktycznie jeden na całą aplikację to chyba zły pomysł?

0

Oki Jeden na sesje...to napisz filtr/servlet który robi flush/clear na poczatku rzadania

0

Mam dokładnie taki sam problem. Nie wiem jak go rozwiązać, a wskazówka zrób servlet/filtr robiący clear /flush niewiele mi mówi @Szczery

Najlepiej jakby istaniała faktycznie metoda entityManager.refreshAll(); Też korzystam z jednego entity managera na sesję. W odpowiednim mojmencie chcę po prostu aby wszystkie obiekty, które wziąłem z entityManagera i które za chwilę wezmę były odświerzone i tyle. Nie chcę by same się odświerzały co chwilę itd. tylko żeby w konkretnym momencie w kodzie wywołać odświeżenie wszystkiego.

0

Oczywiście jak coś zmieni jeden uzytkownik, to drugi ma w tym momencie nieaktualne dane i trzeba robić em.refresh(entityObject), aby zaczytał z bazy dane na nowo (...)

Yyyy... ale po co? Gdzie ten drugi użytkownik ma nieaktualne dane, i po co w ogóle je trzyma? Po to są te wszystkie kesze w JPA żeby móc sobie przy każdym requeście beztrosko robić zapytania do bazy, a nie chomikować wyniki w sesji ;) W ogóle to chyba nie powinni w tym samym momencie pracować na tych samych danych?

0

eh sorry, nie zauważyłem daty wątku...

1 użytkowników online, w tym zalogowanych: 0, gości: 1