# Tabelle wird nicht aktualisiert



## world90 (25. Apr 2015)

Hallo Leute,

ich bin neu hier und brauche eure Hilfe. Ich weiß nicht mehr weiter!

Also ich habe eine JSF-Seite, bei der man Personen (Vorname, Nachname, Spitzname) einer DB hinzufügen kann.
Auf dieser Seite wird auch eine Tabelle mit allen Personen angezeigt.

Wenn ich nun jemand hinzufüge, navigiere ich direkt zur selben Seite. Diese sollte sich eigentlich die Liste der Personen erneut laden und nun aktualisiert ausgeben. Passiert aber nicht!

Bean:

```
package net.gerwald.strabu.bean;

import java.io.IOException;
import java.util.List;


import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;


import net.gerwald.strabu.db.DarstellerDao;
import net.gerwald.strabu.entity.Darsteller;




@ManagedBean
@ViewScoped
public class DarstellerBean {
      
    private String vorname;
    private String nachname;
    private String spitzname;
    
    List<Darsteller> darsteller;
    private DarstellerDao dDao;
    
    public DarstellerBean(){
        dDao = new DarstellerDao();
        darsteller = dDao.getAlleDarsteller();
    }
      
    public String hinzu() throws IOException {
        
        Darsteller darsteller = new Darsteller();
        darsteller.setNachname(nachname);
        darsteller.setVorname(vorname);
        darsteller.setSpitzname(spitzname);
        
        dDao.saveDarsteller(darsteller);
        
        return "darsteller.xhtml";
    }


    public String getVorname() {
        return vorname;
    }


    public void setVorname(String vorname) {
        this.vorname = vorname;
    }


    public String getNachname() {
        return nachname;
    }


    public void setNachname(String nachname) {
        this.nachname = nachname;
    }


    public String getSpitzname() {
        return spitzname;
    }


    public void setSpitzname(String spitzname) {
        this.spitzname = spitzname;
    }


    public List<Darsteller> getDarsteller() {
        return darsteller;
    }


    public void setDarsteller(List<Darsteller> darsteller) {
        this.darsteller = darsteller;
    }
    
}
```

Face:

```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<h:outputStylesheet library="css" name="table-style.css"/>
<title>Darsteller</title>
</h:head>
<h:body>
<h:form>
Straußbu hinzufügen<br/><br/><br/>


Bitte vorher GENAU prüfen, ob die hinzuzufügende Person in der Liste schon vorhanden ist!!!<br/><br/>


<h:dataTable value="#{darstellerBean.darsteller}" var="d"
    styleClass="order-table"
    headerClass="order-table-header"
    rowClasses="order-table-odd-row,order-table-even-row">
    
    <h:column>
        <f:facet name="header">Nachname</f:facet>
        <h:outputText value="#{d.nachname}" />
    </h:column>
    <h:column>
        <f:facet name="header">Vorname</f:facet>
        <h:outputText value="#{d.vorname}" />
    </h:column>
    <h:column>
        <f:facet name="header">Spitzname</f:facet>
        <h:outputText value="#{d.spitzname}" />
    </h:column>
</h:dataTable>
<br/><br/>


<h:panelGrid columns="3">


Vorname:<br />
<h:inputText value="#{darstellerBean.vorname}" required="true" requiredMessage="Vorname erforderlich!" label="Vorname" id="vorname">
</h:inputText>
<h:message for="vorname" style="color:red" />
        
Nachname:<br/>
<h:inputText value="#{darstellerBean.nachname}" required="true" requiredMessage="Nachname erforderlich!" label="Nachname" id="nachname">
</h:inputText>
<h:message for="nachname" style="color:red" />


Spitzname:<br/>
<h:inputText value="#{darstellerBean.spitzname}" required="true" requiredMessage="Spitzname erforderlich - im Zweifel bitte Vorname" label="Spitzname" id="spitzname">
</h:inputText>
<h:message for="spitzname" style="color:red" />


<h:commandButton value="Hinzufügen" action="#{darstellerBean.hinzu}"/>
<h:button outcome="upload" value="Fertig"/>


</h:panelGrid>


</h:form>


</h:body>
</html>
```


Danke für eure Hilfe!


----------



## AntiMuffin (25. Apr 2015)

Hallo,
dein Problem ist das du auf der gleichen Seite bleibst (im gleichen View), aus diesem Grund überlebt das Bean, da es Viewscoped ist. Du solltest also @RequestScoped benutzen, wenn mich nicht alles irrt.

Gruß,
AntiMuffin


----------



## AntiMuffin (25. Apr 2015)

Noch ein Nachtrag:
Es wäre Effektiver wenn du einfach die Daten mit "darsteller = dDao.getAlleDarsteller();" neu laden würdest und null zurück geben würdest. Da der Server dann nur die Daten neu laden muss und nicht das Bean komplett neu erstellen muss (und dabei die Daten neu läd).


----------



## world90 (25. Apr 2015)

Hallo AntiMuffin,

vielen Dank für deine schnelle Antwort.
Ich habe es gerade mit @RequestScope versucht und leider funktioniert es trotzdem nicht.

Deinen Nachtrag habe ich jetzt auf Anhieb nicht verstanden, sorry; Wenn ich für die Liste null ist, geht doch garnichts?

Gruß
Mathias


----------



## AntiMuffin (25. Apr 2015)

Nein ich meinte:

```
package net.gerwald.strabu.bean;
 
import java.io.IOException;
import java.util.List;
 
 
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
 
 
import net.gerwald.strabu.db.DarstellerDao;
import net.gerwald.strabu.entity.Darsteller;
 
 
 
 
@ManagedBean
@ViewScoped
public class DarstellerBean {
 
    private String vorname;
    private String nachname;
    private String spitzname;
 
    List<Darsteller> darsteller;
    private DarstellerDao dDao;
 
    public DarstellerBean(){
        dDao = new DarstellerDao();
        darsteller = dDao.getAlleDarsteller();
    }
 
    public String hinzu() throws IOException {
 
        Darsteller darsteller = new Darsteller();
        darsteller.setNachname(nachname);
        darsteller.setVorname(vorname);
        darsteller.setSpitzname(spitzname);
 
        dDao.saveDarsteller(darsteller);
        darsteller = dDao.getAlleDarsteller(); // Daten neu laden
        return null; // Auf dieser Seite bleiben
    }
 
 
    public String getVorname() {
        return vorname;
    }
 
 
    public void setVorname(String vorname) {
        this.vorname = vorname;
    }
 
 
    public String getNachname() {
        return nachname;
    }
 
 
    public void setNachname(String nachname) {
        this.nachname = nachname;
    }
 
 
    public String getSpitzname() {
        return spitzname;
    }
 
 
    public void setSpitzname(String spitzname) {
        this.spitzname = spitzname;
    }
 
 
    public List<Darsteller> getDarsteller() {
        return darsteller;
    }
 
 
    public void setDarsteller(List<Darsteller> darsteller) {
        this.darsteller = darsteller;
    }
 
}
```

P.S. Dein DarstellerDao ist doch ein Service zum Anlegen, bekommen der Darsteller, usw. Für einen solchen Service solltest du EJB's verwenden und JPA zum für den Datenbankzugriff.


----------



## world90 (25. Apr 2015)

Danke für die Erklärung!

Ich habe auch das eben probiert und es funktioniert leider nicht - ich verzweifele gerade ;(

Allerdings kann ich nicht noch einmal mehr in die hinzu()-Methode hinein debuggen.

EJB werde ich auch noch nutzen. Für den DB-Zugriff verwende ich Hibernate.


----------



## AntiMuffin (25. Apr 2015)

Naja wenn das nicht Funktioniert:
 - Werden denn die Daten überhaupt in die Datenbank geschrieben?
 - Wie sieht deine DarstellerDao Klasse aus ?
 - Wird hinzu () überhaupt aufgerufen? 
 - Müssen im onAction im EL die 2 Klammern sein ?
 - Wieso kein JPA ? :O

Stell mal das Logging Level auf FINE, dann siehst du im Server Protokoll was genau passiert, auch wann er daten schreibt und liest, in JPA geht das so (folgendes in die PU):
<property name="eclipselink.logging.level" value="FINE">
Bezweifle das das mit Hibernate funktioniert, aber evtl gibt es etwas wie:
<property name="hibernate.logging.level" value="FINE">


----------



## world90 (26. Apr 2015)

- Ja, die Daten werden definitiv in die DB geschrieben
- DarstellerDao siehe unten
- Vermutlich wird die Methode aufgerufen, da nur in ihr die Daten in die DB geschrieben werden durch die DarstellerDao
- Ich weiß nicht, welche Klammern du meinst und weiß nicht, was EL sein soll
- Die machen doch im Endeffekt das Gleiche, nur Hibernate habe ich schon oft verwendet und nie Probleme mit gehabt.

Ich werde gleich mal wg. des Logging-Levels schauen.

DarstellerDao:

```
package net.gerwald.strabu.db;

import java.util.List;


import net.gerwald.strabu.entity.Darsteller;


import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;


public class DarstellerDao {


    public Darsteller getDarstellerById(Integer id) {
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        Transaction tx = session.beginTransaction();


        String hql = "SELECT d FROM Darsteller as d WHERE d.id = :darsteller_id";
        Query query = session.createQuery(hql);
        query.setParameter("darsteller_id", id);
        Darsteller darsteller = (Darsteller) query.uniqueResult();
        
        tx.commit();
        
        return darsteller;
    }
    
    public void updateDarsteller(Darsteller darsteller){
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        Transaction tx = session.beginTransaction();


        session.update(darsteller);
        
        tx.commit();
    }
    
    public List<Darsteller> getAlleDarsteller() {
        
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        Transaction tx = session.beginTransaction();


        @SuppressWarnings("unchecked")
        List<Darsteller> darsteller = session.createQuery("SELECT d FROM Darsteller as d ORDER BY d.nachname").list();
        
        tx.commit();
        
        return darsteller;
    }
    
    public void saveDarsteller(Darsteller darsteller){
        Session session = InitSessionFactory.getInstance().getCurrentSession();
        Transaction tx = session.beginTransaction();
        
        session.save(darsteller);
        
        tx.commit();
    }


}
```

PS: Glaube nicht, dass es an dem DB-Zugriff liegt. Eher an der Bean?!


----------



## AntiMuffin (26. Apr 2015)

Also EL ist in der xhtml Datei immer das #{}, aber da die Methode aufgerufen wird ist das egal.
Naja ich wüste nicht wieso es an der Bean liegen sollte 
Du lädst ja die Daten neu in die Liste rein danach sollten die neuen Daten da sein :O

Also ich würde als erstes den Server neu starten und danach versuchen zu debuggen oder das Logging auf fein zu stellen


----------

