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

Diskutiere Entity-Liste (wie @DataModel bei seam) mit CDI im Application Tier Bereich.
J

JanHH

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
 
K

KSG9|sebastian

Ö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} ...
 
J

JanHH

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 ;-)
 
K

KSG9|sebastian

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

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

mp5er

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.
 
Thema: 

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

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben