EBJ JPA Entitymager refresh

0
Mam problem gdzie rozwiązaniem okazało się użycie metody refresh z entitymager-a, ale nie rozumiem dlaczego.

Mam encje A, B oraz C (@Entity)
A zawiera List <B> (@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER))
B zawiera C (@ManyToOne)

Mój @Local @Stateless bean ma dwie metody
pierwsza search() pobiera encję A poprzez entitymanger.find()
druga całkowicie niezależna change() modyfikuje m.in. encję C używając metod: find, persist, merge, createQuery (ale tylko SELECT)

Przy pierwszym użyciu czyli wywołaniu metod: change() a później search() zarówno w bazie danych jak i wywołanie search() zwraca poprawne dane.

Natomiast kolejne change() sprawia że w bazie danych następuję zmiana, ale późniejsze search() zwraca już dane nieaktualne.
Dopiero po dołożeniu w search() refresh(A) sprawiło że entitymanager widzi zawsze aktualne dane

Gdzie szukać problemu? change() nie używa natywnego SQLa, czyli rozumiem ze cache JPA powinien być aktualny? Coś z transakcjami?
0

pokaż kod tych swoich EJB - i nie cache, tylko persistence context, pewnie tu masz jakiś problem.

zzaaaaraz: find, persist, merge, createQuery - a co ty chcesz użyć wszystkich metod z api w jednej metodzie ? wtf ? pewnie robisz em.merge(obiekt) i zapominasz że merge zwraca obiekt hiuheuheuheu

0

Dzięki za zainteresowanie, kod trochę ogarnę i później wrzucę bo jest tam póki co wielki burdel.
Jednak tak czysto teoretycznie, czy ewentualnie kiedy persistent context może być nieaktualny, przy założeniu że dostęp do bazy jest realizowany tylko przez entitymanager i nie ma w nim natywnych zapytań sqla?

0

W takim znaczeniu jak Ty to rozumiesz to nie, bo to nie jest rola persistent context'u.

Ale jestem pewien, że zyebałeś coś z metodą merge() - źle tego użyłeś po prostu.

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