0 Replies Latest reply on May 13, 2009 5:03 PM by deslauriersp

    What happens to the PAGE scope when using EJB components?

    deslauriersp

      I have worked extensively with seam using POJO components and I am now trying to switch to EJB components.


      Imagine this : a page with a list of dogs, and a edit page to modify the selected dog. When you go back to the list of dog, the list is reloaded. The conversation is long running is only when actually editing a dog.


      Can anyone help me : is there a easy way to have a @DataModel list which gets loaded only once, whitout having a long running conversion?


      See code below…


      The problem with the code below is that even if the « dogs » is outjected in the scope page, the « dogs » will be null at next request because the component will re-init as the conversation is not long running. So the factory will be called again.


      It’s also impossible to re-inject the « dogs », because when @DataModel outjects « dogs » in the page scope , it will also « magically » transform the List into a DataModelList….which is ok.


      Is there anything wrong with what I try to do? Here’s how I see it…


      1. There’s no (good) reason why the list of dog should be in a long running conversation.


      2. I just can’t see SQL running twice uselessly without having a panic attack.



      @Stateful
      @Name("dogManager")
      public class DogManager {
      
         @DataModel(scope = ScopeType.PAGE)
         private List<Dog>      dogs;
      
         @DataModelSelection
         @Out(required=false, Scope=ScopeType.CONVERSATION)
         private Dog            dog;
         
         @In
         EntityManager           em;
         
         @Factory(value = "dogs")
         public void initDogs() {
            dogs = (List<Dog>) em.createQuery("SELECT DISTINCT d FROM Dog d  ").getResultList();
         }
      
         @Begin
         public void edit(){
         }
         
         @End
         public void save(){
      ...
         }
         @End
         public void cancel(){
      ...
         }
      ...
      }