2012-05-25 3 views
4

Я разрабатываю веб-приложение на основе 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(); 
} 

Это путь?

ответ

1

Я использую ExtendedPerssisteenceContext в Мои Сущности содержат ребенка сущностей Коллекции отложенной загрузки типа.

Это не повод для использования EXTENDED. Я бы предложил вам сделать это default, то есть TRANSACTION. И хорошо сделать свой EntityManager с областью действия запроса или с помощью метода в не-корпоративной среде или при использовании персистентности, управляемой приложением, поскольку это не очень тяжелый объект для создания. Более того, ни использование EntityManager с областью приложения не является хорошей идеей, поскольку она не является потокобезопасной.

Сказав, что при использовании JBoss вы должны позволить контейнеру обрабатывать жизненный цикл EntityManager, если вы используете JTA. Таким образом, просто впрыснуть, что со всем default

Примечание:

только сеансные бобы могут иметь управляемый контейнер, расширенный менеджер объекта.

Ссылки:

Предложения:

Ваш бизнес-метод должен знать, загружать ли детей или нет. Но это идеальный случай. Несколько раз мы не можем сказать этого и полностью зависит от ввода пользователя - мы не можем так хорошо предсказать. Таким образом, существует два доступных решений,

  1. сделать отдельный вызов AJAX для загрузки детей
  2. Используйте фильтр называется открытым сеанс в поле зрения. Я бы предпочел первый.

Ссылки:

+0

Тогда Как бороться с отображением дочерних коллекций в виду? Должен ли я писать JPQL для загрузки ленивых коллекций еще до закрытия EntityManager? –

+0

@ sivaprasadreddy.k: Ваш бизнес-метод должен знать, загружать ли детей или нет. Но это идеальный случай. Несколько раз мы не можем сказать этого и полностью зависит от ввода пользователя - мы не можем так хорошо предсказать. Таким образом, есть два доступных решения: 1. сделайте отдельный вызов AJAX для загрузки детей. 2. Используйте фильтр, называемый open-session-in-view. Я бы предпочел первый. –

+0

Большое спасибо Adeel Ansari. –

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