Я разрабатываю веб-приложение на основе JavaEE6, используя JBoss7. В моем приложении я инъекция EntityManager в моих EJBs как:Администратор EntityManager JPA должен быть запрошен?
class ForumServiceEJB
{
@PersistenceContext(type=EXTENDED)
private EntityManager em;
}
class TopicServiceEJB
{
@PersistenceContext(type=EXTENDED)
private EntityManager em;
}
Проблема при обновлении некоторых данных, используя EntityManager ForumServiceEJB в то изменения, внесенные в БД, но EntityManager TopicServiceEJB является не в состоянии увидеть эти изменения и результаты всегда извлекаются из кеша.
Я использую ExtendedPerssisteenceContext, поскольку мои сущности содержат дочерние коллекции экземпляров типа Lazy Loading.
Как я могу использовать/Inject EntityManager типа ExtendedPersistenceContext и создавать разные EntityManager в одном EJB, все еще могут видеть изменения, сделанные другими EJB EntityManager?
Где-то я читал EntityManager, должны быть объекты RequestScoped.
public class MyEntityManagerProducers {
@Produces @RequestScoped
public EntityManager createDbEm() {
return Persistence.createEntityManagerFactory("forumDb").
createEntityManager();
}
public void disposeUdEm(@Disposes EntityManager em) {
em.close();
}
Это путь?
Тогда Как бороться с отображением дочерних коллекций в виду? Должен ли я писать JPQL для загрузки ленивых коллекций еще до закрытия EntityManager? –
@ sivaprasadreddy.k: Ваш бизнес-метод должен знать, загружать ли детей или нет. Но это идеальный случай. Несколько раз мы не можем сказать этого и полностью зависит от ввода пользователя - мы не можем так хорошо предсказать. Таким образом, есть два доступных решения: 1. сделайте отдельный вызов AJAX для загрузки детей. 2. Используйте фильтр, называемый open-session-in-view. Я бы предпочел первый. –
Большое спасибо Adeel Ansari. –