2010-07-08 2 views
0

Как обновить коллекцию объектов getResultList при включенном кеше JPA. Я имею в виду:Обновление коллекции (getResultList) объектов entityManager.refresh

Список клиентов = query.getResultList();

????? > em.refresh (клиенты)! // Мне нужно обновить, потому что кеш включен.

УВАЖЕНИЕ Навид

+0

Не могли бы вы упомянуть поставщика, которого вы используете, и как включен кеш (я думаю, это вопрос с JPA 2.0, но обычно помогает контекстная информация)? Собственно, не могли бы вы прояснить весь вопрос и отформатировать его соответствующим образом (я даже не понимаю, что вы пытаетесь показать)? В чем проблема, которую вы пытаетесь решить? Зачем вам «обновлять» что-то? –

+0

Я использую eclipselink, glassfish v3, JPA 2.0 (я думаю, как обеспечить версию JPA) – Nav

+0

У меня есть два объекта, такие как Customer and Orders, у каждого клиента есть много заказов, поэтому я создал отношения @OneToMany и @ManyToOne между ними, поэтому, когда я нахожу объект клиента em.find(), заказы не обновляют и не поступают из кеша, но iam вызывает em.refresh (клиент), но кажется, что эта команда не обновляет заказы клиента. – Nav

ответ

5

В JPA 2.0 может быть проще пропустить кеш L2 полностью, используя подсказку запроса. Например:

Query query = em.createQuery(...); 
query.setHint("javax.persistence.cache.retrieveMode", "BYPASS"); // skip the L2 cache. 
List customers = query.getResultList(); 

Это еще не доступно в JPA 1.0. Если вы используете JPA 1.0, вам, возможно, придется использовать специфический для поставщика API. Я считаю, что Hibernate предоставляет что-то похожее на подсказку JPA 2.0 (у других поставщиков также может быть этот механизм). OpenJPA имеет метод refreshAll(Collection c), который также должен работать на вас, и я подозреваю, что у других поставщиков есть что-то подобное. EclipseLink, похоже, не имеет этого.

+0

Не работает! -> setHint ("javax.persistence.cache.retrieveMode", "BYPASS"); Я использую JPA2 eclipselink и glassfish v3 со всеми настройками по умолчанию и кодированием – Nav

+0

, если я вызываю em.getEntityManagerFactory(). GetCache(). EvictAll(); befor quering it works Но я не хочу очистить весь кеш L2 для этого запроса. как правильно настроить свой ответ? – Nav

+0

eclipselink не имеет refreshAll !! – Nav

3

Перед тем, как позвонить em.refresh() вы должны очистить кэш em.getEntityManagerFactory() getCache() evictAll()..;

Это новая функция в JPA2, поэтому вы, вероятно, должны обновить структуру ORM.

+0

если я очистил кеш, поэтому нет необходимости вызывать обновление, не так ли? – Nav

+0

моя проблема заключается в том, как обновить коллекцию объектов – Nav

+0

обновление перезаписывает последние изменения с db на объект, поэтому вы должны называть его для каждого объекта сущности – ambassador86

Смежные вопросы