2016-04-21 12 views
0

Ich habe 2 Klassen Games und Fouls, es gibt viele Fouls in einem Spiel. Der Benutzer sendet einen Parameter mit dem Spiel id, um die gewünschte game zu finden, und danach wird die currentGame Variable erstellt. Sein Typ ist Game. Ich habe eine datatable, die die Fouls im aktuellen Spiel drucktUpdate-Variable aus der Datenbank nach dem Einreichen

Die setCurentGame Setter heißt Formular der Körper der Seite onload.

Bisher funktioniert alles in Ordnung, aber wenn ich ein neues foul hinzufüge, wird nicht zur Datentabelle hinzugefügt, meine Annahme ist, dass das Spiel bereits abgerufen wurde (weil das aktuelle Spiel zuvor erstellt wurde), so dass das neue Foul in der Datenbank ist und nicht im Spiel currentGame.

Gibt es eine Möglichkeit, dass ich das currentGame jedes Mal aktualisieren kann, wenn ich ein Foul addiere?

Ich habe versucht, die Seite zu aktualisieren und auch die seeter wieder aufzurufen, nachdem das Foul zu schaffen, aber nichts funktionierte

Die datatable sieht wie folgt aus:

<p:dataTable id="datalist" value="#{gameController.currentGame.foulCollection}" var="item"> 

        <f:facet name="{exporters}"> 

        </f:facet> 
        <p:ajax event="rowSelect" update="createButton viewButton editButton deleteButton"/> 
        <p:ajax event="rowUnselect" update="createButton viewButton editButton deleteButton"/> 

        <p:column width="32" sortBy="#{item.id}" filterBy="#{item.id}"> 
         <f:facet name="header"> 
          <h:outputText value="#{bundle.ListFoulTitle_id}"/> 
         </f:facet> 
         <h:outputText value="#{item.id}"/> 
        </p:column> 

        <p:column sortBy="#{item.quarter}" filterBy="#{item.quarter}"> 
         <f:facet name="header"> 
          <h:outputText value="#{bundle.ListFoulTitle_quarter}"/> 
         </f:facet> 
         <h:outputText value="#{item.quarter}"/> 
        </p:column> 
        <p:column sortBy="#{item.foultime}" filterBy="#{item.foultime}"> 
         <f:facet name="header"> 
          <h:outputText value="#{bundle.ListFoulTitle_foultime}"/> 
         </f:facet> 
         <h:outputText value="#{item.foultime}"/> 
        </p:column> 





        <f:facet name="footer"> 
         <p:commandButton id="createButton" icon="ui-icon-plus" value="#{bundle.Create}" actionListener="#{foulController.prepareCreate}" update=":FoulCreateForm" oncomplete="PF('FoulCreateDialog').show()"/> 

        </f:facet> 
       </p:dataTable> 

Gamecontroller Bohne:

package onisiforos.fouls.classes; 

import onisiforos.fouls.db.Game; 
import onisiforos.fouls.classes.util.JsfUtil; 
import onisiforos.fouls.classes.util.JsfUtil.PersistAction; 
import onisiforos.fouls.bean.GameFacade; 

import java.io.Serializable; 
import java.util.List; 
import java.util.ResourceBundle; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.ejb.EJB; 
import javax.ejb.EJBException; 
import javax.inject.Named; 
import javax.enterprise.context.SessionScoped; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.FacesConverter; 

@Named("gameController") 
@SessionScoped 
public class GameController implements Serializable { 

    @EJB 
    private onisiforos.fouls.bean.GameFacade ejbFacade; 
    private List<Game> items = null; 
    private Game selected; 
    private Game currentGame; 

    public Game getCurrentGame() { 
     return currentGame; 
    } 



    public void setCurrentGame() { 
     int gid = 
     Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("gameid")); 
     Game cg = getGame(gid); 
     this.currentGame = cg; 
    } 




    public GameController() { 
    } 

    public Game getSelected() { 
     return selected; 
    } 

    public void setSelected(Game selected) { 
     this.selected = selected; 
    } 

    protected void setEmbeddableKeys() { 
    } 

    protected void initializeEmbeddableKey() { 
    } 

    private GameFacade getFacade() { 
     return ejbFacade; 
    } 

    public Game prepareCreate() { 
     selected = new Game(); 
     initializeEmbeddableKey(); 
     return selected; 
    } 



     public void create() { 
      setCurrentGame() 
      persist(PersistAction.CREATE, ResourceBundle.getBundle("/Bundle").getString("GameCreated")); 
      updateCurrentGame(); 
      if (!JsfUtil.isValidationFailed()) { 
       items = null;  
      } 
     } 

    public void update() { 
     persist(PersistAction.UPDATE, ResourceBundle.getBundle("/Bundle").getString("GameUpdated")); 
    } 

    public void destroy() { 
     persist(PersistAction.DELETE, ResourceBundle.getBundle("/Bundle").getString("GameDeleted")); 
     if (!JsfUtil.isValidationFailed()) { 
      selected = null; // Remove selection 
      items = null;  
     } 
    } 

    public List<Game> getGames() { 
     if (items == null) { 
      items = getFacade().findAll(); 
     } 
     return items; 
    } 

    private void persist(PersistAction persistAction, String successMessage) { 
     if (selected != null) { 
      setEmbeddableKeys(); 
      try { 
       if (persistAction != PersistAction.DELETE) { 
        getFacade().edit(selected); 
       } else { 
        getFacade().remove(selected); 
       } 
       JsfUtil.addSuccessMessage(successMessage); 
      } catch (EJBException ex) { 
       String msg = ""; 
       Throwable cause = ex.getCause(); 
       if (cause != null) { 
        msg = cause.getLocalizedMessage(); 
       } 
       if (msg.length() > 0) { 
        JsfUtil.addErrorMessage(msg); 
       } else { 
        JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured")); 
       } 
      } catch (Exception ex) { 
       Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex); 
       JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured")); 
      } 
     } 
    } 

    public Game getGame(java.lang.Integer id) { 
     return getFacade().find(id); 
    } 

    public List<Game> getItemsAvailableSelectMany() { 
     return getFacade().findAll(); 
    } 

    public List<Game> getItemsAvailableSelectOne() { 
     return getFacade().findAll(); 
    } 

    @FacesConverter(forClass = Game.class) 
    public static class GameControllerConverter implements Converter { 

     @Override 
     public Object getAsObject(FacesContext facesContext, UIComponent component, String value) { 
      if (value == null || value.length() == 0) { 
       return null; 
      } 
      GameController controller = (GameController) facesContext.getApplication().getELResolver(). 
        getValue(facesContext.getELContext(), null, "gameController"); 
      return controller.getGame(getKey(value)); 
     } 

     java.lang.Integer getKey(String value) { 
      java.lang.Integer key; 
      key = Integer.valueOf(value); 
      return key; 
     } 

     String getStringKey(java.lang.Integer value) { 
      StringBuilder sb = new StringBuilder(); 
      sb.append(value); 
      return sb.toString(); 
     } 

     @Override 
     public String getAsString(FacesContext facesContext, UIComponent component, Object object) { 
      if (object == null) { 
       return null; 
      } 
      if (object instanceof Game) { 
       Game o = (Game) object; 
       return getStringKey(o.getId()); 
      } else { 
       Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "object {0} is of type {1}; expected type: {2}", new Object[]{object, object.getClass().getName(), Game.class.getName()}); 
       return null; 
      } 
     } 

    } 

} 
+0

Ist Ihre verwaltete Bean Session-Bereich oder Anforderungsbereichs? Ich denke, dass die Setter-Methode zum Abrufen von currentGame aus der Datenbank nicht geeignet ist, Sie können dafür die @ PostConstruct-Methode verwenden (wenn Ihre Bean Anfragebereich ist). –

+0

Danke für die Antwort. Meine Bean ist SessionScoped. @Mojtaba Safaeian – user784512

+0

Bitte fügen Sie Ihren vollständigen XHTML und Bohnen Code –

Antwort

0

Es scheint, dass Ihre setCurrentGame Methode nicht aufgerufen wird, können Sie manuell aufrufen es in Ihrer create() Methode, um das aktuelle Spielobjekt von der Datenbank zu aktualisieren, nachdem das Foul erstellt wird.

+0

Ich habe dies bereits versucht. setCurrentGame wird aufgerufen, aber die Werte darin werden nicht aktualisiert. – user784512

+0

Übrigens habe ich vergessen zu erwähnen, dass wenn ich ein Foul aktualisiere, das Foul ebenfalls in der Datentabelle aktualisiert wird, aber beim Erstellen oder Löschen passiert keine Aktualisierung in der Datentabelle. aber alle drei Operationen funktionieren gut mit der Datenbank. – user784512

+0

Sind Sie sicher, dass setCurrentGame nach der Aktualisierung der Datenbank aufgerufen wird? –

Verwandte Themen