Entity-Liste (wie @DataModel bei seam) mit CDI

Dieses Thema Entity-Liste (wie @DataModel bei seam) mit CDI im Forum "Application Tier" wurde erstellt von JanHH, 16. Jan. 2013.

Thema: Entity-Liste (wie @DataModel bei seam) mit CDI Hallo, versuch grad mich in JEE6 einzuarbeiten.. was relativ simples wie eine Liste mit Entities aus einer...

  1. Hallo,

    versuch grad mich in JEE6 einzuarbeiten..

    was relativ simples wie eine Liste mit Entities aus einer Datenbanktabelle, bei seam @DataModel (mit @Factory-Methode)..

    wie geht dat? Irgendwas mit @Produces, nehme ich an?

    - die Liste soll unter ihrem Namen per DI verfügbar sein (auch in JSF-EL usw)
    - die Liste soll nicht bei jedem Zugriff (wie das z.B. bei einer simplen get-Methode der Fall wäre) neu geladen werden, sondern nur dann, wenn sie null ist

    Mit seam2 extrem simpel, bei JEE6 stellts mich vor Herausforderungen.

    Bitte um Hilfe/Beispiele..

    Gruß+Danke
    Jan
     
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. Öhm, ich versteh dein Problem nicht so ganz (liegt wohl daran das ich nicht mit Seam arbeite).

    Aber ganz pragmatisch:

    - EJB erstellen welches dir die Entitites liefert
    Code (Text):

    @Stateless
    public class MyEjb{

       @PersistenceContext  
       private EntityManager entityManager;

       public List<Foo> getFoos(){
          return (List<Foo>) entityManager.createQuery("from Foo f").getResultList();
       }
    }
     
    In deinem Controller (ManagedBean)

    Code (Text):

    @Named("myController")
    class MyController{

       @EJB
       private MyEjb ejb;

       public List<Foo> getFoos(){
          return ejb.getFoos();
       }
    }
     
    In in JSF dann

    Code (Text):

    ... #{myController.foos} ...
     
     
  4. Ja, klar.

    Aber dann wird die Liste bei jedem Zugriff aus der Datenbank neu geladen. Das will ich halt nicht.

    vielleicht relativ simpel so
    Code (Java):

    @Stateful
    public class MyEjb{

       @PersistenceContext  
       private EntityManager entityManager;

       private List<Foo> fooList;

       public List<Foo> getFoos(){
          if(fooList==null) {
             fooList=entityManager.createQuery("from Foo f").getResultList();
          };

          return fooList;
       }
    }
     
    Wenns wirklich so simpel ist entschuldige ich mich für die Frage ;-)
     
  5. Ok, jetzt verstehe ich...:)

    Dafür kannst du z.B. einen "Container" schreiben welcher die Daten über ein EJB einmalig besorgt. Den Container lässt du dann als SessionScoped injecten
     
  6. Jo, sowas habsch auch gedacht.
     
  7. Sym
    Sym
    Als Tip:

    Der Sessionscope ist nur zu verwenden, wenn dies auch notwendig ist. Sollte sich die Liste während einer Session ändern können, sollte man damit vorsichtig sein und einen kleineren Scope wählen. Die Datenbank ist nämlich seltener das Bottleneck. Sollte sich die Liste nie ändern, sollte man den ApplicationScope verwenden.
     
  8. Ich denke das könnte dir weiterhelfen:

    Producer Methode
    Code (Text):
        @Produces
            @Named
        @SessionScoped
        public List<Foo> produceFoos() {
                return entityManager.createQuery("from Foo f").getResultList();
        }

    Aufruf mittels EL:


    Code (Text):
    #{produceFoos}
    Injection in andere CDI Bean:

    Code (Text):

    @Inject
    private List<Foo> foos;
    Falls du mehrere "Foo Producer" hast musst du Qualifier verwenden.
     
  9. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!