2009-09-23 10 views
5

Jest oświadczenie w EJB-3_0-FR-SPEC-persistence.pdf który brzmiJPA: Jak zsynchronizować kontekst utrwalania z wynikiem aktualizacji zbiorczej lub usunąć?

Kontekst wytrwałość nie jest zsynchronizowany z wynikiem zbiorczego aktualizacji lub usuwania

więc jeśli wykonaj query.executeUpdate, która usuwa wiersze z tabeli. Te same wiersze nadal istnieją w innym obiekcie od jednego do wielu kolekcji. Kiedy ponownie uruchomię aplikację, widzę, że fantomowe obiekty są teraz usuwane z kolekcji.

Czy istnieje (ładny \ prosty \ ogólny) sposób synchronizacji pamięci podręcznej JPA z wynikiem aktualizacji zbiorczej \ delete?

BTW. Korzystam z EclipseLink, wersja: Eclipse Persistence Services - 1.1.0.r3634.

Dzięki,

Phil.

+1

Wierzę, że istnieje [http://stackoverflow.com/questions/5832415/entitymanager-refresh][]. W rzeczywistości zadziałało to dla mnie. [1]: http://stackoverflow.com/questions/5832415/entitymanager-refresh –

Odpowiedz

5

Musisz uważać, używając słowa "pamięć podręczna", ponieważ może to oznaczać różne rzeczy.

Podkreślona fraza mówi o kontekście trwałości, który można uważać za "pamięć podręczną pierwszego poziomu". W celu uaktualnienia go z najnowszymi zmianami z bazy danych można:

  1. Wezwania EntityManager.refresh() aby odświeżyć stan w pojedynczego podmiotu.
  2. LUB całkowicie odrzucić instancję menedżera encji (po ewentualnym wyczyszczeniu/wyczyszczeniu zmian) i uzyskać nową z fabryki zarządzających podmiotami. Wszelkie elementy ładowane z tej nowej instancji będą ładowane z bazy danych, a więc będą zawierały najnowsze zmiany.

Może być również "pamięć podręczna drugiego poziomu", która nie jest powiązana z określonym menedżerem encji. Możesz go odświeżyć (lub raczej wyczyścić i pozwolić na ponowne wypełnienie się) przy użyciu własnego API (różni się między dostawcami pamięci podręcznej).

1

Kontekst utrwalania nie jest aktualizowany w celu odzwierciedlenia wyników operacji aktualizacji i usuwania. Jeśli używasz kontekstu utrwalania o zasięgu transakcji, powinieneś albo wykonać operację masową w samej transakcji, albo wykonać pierwszą operację w transakcji (zobacz Wprowadzenie do transakcji EclipseLink). Dzieje się tak dlatego, że każda jednostka aktywnie zarządzana przez kontekst utrwalania nie będzie świadoma faktycznych zmian zachodzących na poziomie bazy danych.

Fell wygodne wbić mi tutaj na http://puspendu.wordpress.com/2010/12/22/sync-jpa-database-multiple-application/

4

W ten sposób można usunąć z pamięci podręcznej danych.

entityManager.getEntityManagerFactory().getCache().evictAll(); 
+0

Co o wydajności podczas postępując w taki sposób? –

1

Pamięć podręczna pierwszego poziomu (EntityManager/transaction) będzie musiała zostać ręcznie odświeżona lub wyczyszczona. Możesz odświeżyć obiekty, wywołać polecenie clear() lub uzyskać nowy EntityManager.

Pamięć podręczna drugiego poziomu (współużytkowana pamięć podręczna) powinna zostać automatycznie unieważniona po zatwierdzeniu transakcji. Jeśli nie jest to z jakiegoś powodu, możesz użyć interfejsu API JPA Cache lub EclipseLink JpaCache API, aby usunąć lub unieważnić obiekty, lub możesz je odświeżyć.