Почему мой компонент @ApplicationScope CDI не обновляется? - PullRequest
2 голосов
/ 04 декабря 2011

В моем приложении у меня есть @ApplicationScoped CDI-компонент для хранения некоторой информации из базы данных:

@Named
@ApplicationScoped
public class MrBean {
   @EJB
   private SoyaBean soyaBean;
   private List<Toys> myToys;

   @PostConstruct
   public void prepareMrBean() {
      this.myToys = soyaBean.getToys();
   }

   public void updateToys() {
      this.myToys = soyaBean.getToys();
   }
}

У меня также есть страница AddToy.xhtml, которая просто добавит игрушку в базу данных.Поддерживающий компонент выглядит следующим образом:

@Named
@RequestScoped
public class MrsBean {
   @EJB
   private SoyaBean soyaBean;
   @Inject
   private MrBean mrBean;

   public void addToy() {
      this.soyaBean.addToy();
      this.mrBean.updateToys();
   }
}

Поскольку в базу данных добавлена ​​новая игрушка, я хотел обновить список игрушек в mrBean.Однако, несмотря на то, что mrsBean вызвал mrBean.updateToys(), список игрушек в mrBean вообще не обновляется.У меня есть другой ViewToys.xhtml с @RequestScoped компонентом поддержки для просмотра списка игрушек, и я не видел, чтобы список обновлялся.

Я был бы очень признателен, если бы кто-то мог дать мне совет покак решить эту проблему.

ОБНОВЛЕНИЕ : Это моя реализация SoyaBean:

@Stateless
public class SoyaBeanImpl implements SoyaBean {
   @PersistenceContext()
   private EntityManager em;

   @Override
   public List<Toys> getToys() {
      Query q = em.createQuery("SELECT T from Toys T");
      return (List<Toys>) q.getResultList();
   }

   @Override
   public void addToy() {
      Toys newToy = new Toys();
      em.persist(newToy);
   }
}

ОБНОВЛЕНИЕ 2 Я также очень признателен, есликто-то может показать мне, как я могу достичь той же цели любым другим способом, кроме моего беспокойного пути.

С наилучшими пожеланиями,

Джеймс Тран

Ответы [ 2 ]

0 голосов
/ 18 декабря 2011

Проблема заключалась в том, что результаты всех запросов SQL были кэшированы.Следовательно, хотя я и пытался обновить список игрушек, он получил только старый результат.Я решил эту проблему, установив параметр Shared Cache Mode в файле persistence.xml на None.

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

0 голосов
/ 10 декабря 2011

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

Cluprit: База данных?

Конечно, у вас может быть проблема с кэшированием в базовом БД. Однако это маловероятно, учитывая ваше описание операторов system.out.

Виновник: боб?

Более вероятным виновником является то, что результаты запроса каким-то образом кэшируются в компоненте, или, скорее, в возвращаемом значении набора результатов запроса. Если ваша тестовая база данных допускает грязное чтение, это может быть объяснением. Это можно проверить, например, используя @Interceptor для обновления запроса перед любыми вызовами getToys ().

Еще одна потенциальная ловушка здесь: ошибка безгражданства и кэширование.

Наконец: краткое слово о безгражданстве. Хотя вы и правы, что отсутствие состояния компонента должно приводить, вообще говоря, к данным, которые не устарели - это не всегда так. Реальное определение bean-компонентов без сохранения состояния в контексте EJB заключается в том, что эти bean-компоненты не гарантируют наличие состояния в течение жизненного цикла приложения.

В целом, есть 3 различных способа добраться до сути вашей проблемы:

1) Убедитесь, что база данных не делает ничего смешного с грязным чтением. 2) Проверьте, нет ли проблем с перехватом вызова getToys () и выполнением / проверкой запроса к базе данных. 3) Убедитесь, что требуемый тип безгражданства реализуется вашим контейнером ejb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...