2016-04-21 48 views
0

我有2个类GamesFouls,游戏中有很多犯规。用户用游戏id发送一个参数来找到他想要的game,之后currentGame变量被创建。它的类型是Game。我有一个datatable这打印在当前游戏中的犯规提交后从数据库检索到更新变量

setCurentGame setter被称为形式页的主体onload

到目前为止一切正常,但是当我添加一个新的foul,没有添加到数据表中,我的假设是游戏已经被检索(因为当前的游戏是之前创建的),所以新的犯规是在数据库中而不是在游戏currentGame中。

有没有什么办法可以在我每次犯规添加犯规时更新currentGame?

我曾尝试刷新页面,甚至打造犯规后,再次拨打seeter但是毫无效果

datatable看起来是这样的:

<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豆:

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

是您的托管bean会话作用域还是请求作用域?我认为setter方法不适合从数据库中检索currentGame,你可以使用@PostConstruct方法来做到这一点(如果你的bean是请求作用域)。 –

+0

感谢您的回应。我的bean的SessionScoped。 @Mojtaba Safaeian – user784512

+0

请添加您的完整xhtml和豆类代码 –

回答

0

看来你的setCurrentGame方法不会被调用,你可以手动调用它在你的create()方法中创建犯规后从数据库更新当前游戏对象。

+0

我已经试过这个。 setCurrentGame被调用,但其中的值仍然没有更新 – user784512

+0

顺便说一句,我忘记提及,当我更新犯规,犯规也在数据表中更新,但是当创建或删除一个没有更新发生在数据表中。但是这三个操作都可以在数据库中正常工作。 – user784512

+0

您确定在更新数据库后调用setCurrentGame吗? –