# Stateful EJB



## ratnalein (1. Mrz 2014)

Hallo zusammen,

ich habe gelernt, dass bei einer Stateful-EJB der Zustand der Bean gespeichert wird, solange die Verbindung zum Client nicht beendet ist.  Folgender Code ist so ein Beispiel von einer Stateful-EJB:


```
@Stateful
@Named
@StatefulTimeout(unit = TimeUnit.MINUTES, value = 30)
@SessionScoped
//@ApplicationScoped
public class ItemServiceStateful { 
    private Integer numberOfItems = 0;
     
    public void increaseItems() {
        numberOfItems++;
    }
     
    public int numberOfItems() {
        return numberOfItems;
    }
 
}
```

Sehr verständlich eigentlich.  Allerdings frage ich mich:
Warum soll man den obigen Code als Stateful implementieren?  Als "normale" Java-Klasse ginge doch auch?  

Ist es vielleicht so, dass der obige Code zu einfach ist, um die Mächtigkeit einer Stateful-EJB darzustellen?  Denn wie gesagt, ich könnte doch auch in dem Beispiel ohne irgendwelche Annotation zum Laufen bringen?


Worauf ich wirklich hiaus möchte ich allerdings:
ich verstehe nicht, was dieser Begriff "Conversation state" bedeutet.  Was für ein Zustand ist hier von Rede, sind es die Variablenzustände?  Falls ja, dann komme ich wieder auf die obige Frage: ohne Stateful-Annotation wären die Variablen doch auch immer aktuell und nach jeder Veränderung gemerkt, oder?
Vielen Dank für Eure Hilfestellungen.

Viele Grüße aus Rheinland,

Eure Ratna


----------



## BuckRogers (6. Mrz 2014)

Hi Ratna,

wie der Name schon verrät ist es eine SessionBean. Sie gehört zu der Session von der Sie aufgerufen wird und die "@Stateful"-Annotation legt fest dass für diese Session auch nur diese Bean verwendet wird. Somit kannst mit dieser Bean arbeiten und nur dieser!
Als Beispiel kann man da wiedermal den Warenkorb eines Kunden nehmen. Wenn der Warenkorb "@Stateful" ist, dann kann man da einen Artikel nach dem Anderen reinpacken und irgendwann bezahlen. Du in deinem Fall inkrementierst und speicherst die Variablen. Es wird sichergestellt dass immer genau diese Bean benutzt wird.

Wenn du hingegen "@Stateless"-Annotation verwendest, dann wird pro Methodenaufruf eine neue Beaninstanz aufgerufen und du kannst nicht wirklich damit arbeiten, da pro hinzugefügtem Artikel der Warenkorb überschrieben werden würde und immer nur einen Artikel beinhaltet.

Der Conversational State beschreibt halt genau dieses Verhalten von Stateful und Stateless. 

Generell gelten die Beans als POJOs. Also als simples Java-Objekt. Die Felder(Variablen) in der Bean werden auch nur für die Session gespeichert, wenn du welche initialisierst.

Ich hoffe es ist ein wenig verständlich.


----------

