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

JanHH

Top Contributor
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
 

KSG9|sebastian

Top Contributor
Ö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:
@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:
@Named("myController")
class MyController{

   @EJB
   private MyEjb ejb;

   public List<Foo> getFoos(){
      return ejb.getFoos();
   }
}

In in JSF dann

Code:
... #{myController.foos} ...
 

JanHH

Top Contributor
Ja, klar.

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

vielleicht relativ simpel so
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 ;-)
 

KSG9|sebastian

Top Contributor
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
 
S

Sym

Gast
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.
 

mp5er

Neues Mitglied
Ich denke das könnte dir weiterhelfen:

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

Aufruf mittels EL:


Code:
#{produceFoos}

Injection in andere CDI Bean:

Code:
@Inject
private List<Foo> foos;

Falls du mehrere "Foo Producer" hast musst du Qualifier verwenden.
 

Ähnliche Java Themen

Neue Themen


Oben