如何刷新父实体,以便在创建其子实体时,我的页面显示父实体和仅属于所选父实体的子实体

问题描述 投票:-2回答:1

这是到目前为止我尝试过的。有两个名为BinCardHeaderBinCardLine的实体,分别具有一对多的关系。下面是BinCardHeader的视图页面。它具有选定的BinCardHeader和BinCardLine的列表。我想要的是在侧面BinCardHeader视图中创建BinCardLine,要刷新BinCardHeader视图页面以及BinCardLine列表中包含仅属于当前BinCardHeader的项目的情况。

两个实体都有一个执行创建,编辑,删除操作的控制器。控制器看起来像

@Named("binCardHeaderController")
@SessionScoped
public class BinCardHeaderController implements Serializable {

@EJB
private com.stock.stockmanagementsystem.session.BinCardHeaderFacade 
ejbFacade;
private List<BinCardHeader> items = null;
private BinCardHeader selected;

public BinCardHeaderController() {
}

public BinCardHeader getSelected() {
    return selected;
}

public BinCardHeaderFacade getFacade() {
    return ejbFacade;
}
public void setSelected(BinCardHeader selected) {
    this.selected = selected;
}
 public void destroy() {
      persist(PersistAction.DELETE, 
      ResourceBundle.getBundle("/resources/Bundle")
     .getString("BinCardHeaderDeleted"));
    if (!JsfUtil.isValidationFailed()) {
        selected = null; // Remove selection
        items = null;    // Invalidate list of items to trigger re-query.
    }
}

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

  public void setItems(List<BinCardHeader> items) {
    this.items = 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("/resources/Bundle").getString("PersistenceErrorOccured"));
            }
        } catch (Exception ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/resources/Bundle").getString("PersistenceErrorOccured"));
        }
     }
  }

ejbFacade是BinCardHeaderFacade的对象,如下所示

@Stateless
public class BinCardHeaderFacade extends AbstractFacade<BinCardHeader> {

@PersistenceContext(unitName = "com.stock_StockManagementSystem_war_1.0- 
SNAPSHOTPU")
private EntityManager em;

@Override
protected EntityManager getEntityManager() {
    return em;
}

public BinCardHeaderFacade() {
    super(BinCardHeader.class);
}

 }

  **The AbstractFacade looks like below**



     public abstract class AbstractFacade<T> {

        private Class<T> entityClass;

        public AbstractFacade(Class<T> entityClass) {
            this.entityClass = entityClass;
        }

        protected abstract EntityManager getEntityManager();

        public void create(T entity) {
            getEntityManager().persist(entity);
        }

        public void edit(T entity) {
            getEntityManager().merge(entity);
        }

        public void remove(T entity) {
            getEntityManager().remove(getEntityManager().merge(entity));
        }
         }

BinCardHeader的列表如下:

<p:dataTable id="datalist" value="#{binCardHeaderController.items}" 
                  var="item" selectionMode="single" selection="# 
                  {binCardHeaderController.selected}"
                  paginator="true"
                  rowKey="#{item.id}"
                  rows="10"
                  rowsPerPageTemplate="10,20,30,40,50">

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

                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="# 
         {bundle.ListBinCardHeaderTitle_id}"/>
                            </f:facet>
                            <h:outputText value="#{item.id}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="# 
           {bundle.ListBinCardHeaderTitle_maximumLevel}"/>
                            </f:facet>
                            <h:outputText value="#{item.maximumLevel}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="# 
            {bundle.ListBinCardHeaderTitle_reorderLevel}"/>
                            </f:facet>
                            <h:outputText value="#{item.reorderLevel}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="# 
         {bundle.ListBinCardHeaderTitle_minimumLevel}"/>
                            </f:facet>
                            <h:outputText value="#{item.minimumLevel}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="# 
     {bundle.ListBinCardHeaderTitle_location}"/>
                            </f:facet>
                            <h:outputText value="#{item.location}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="# 
           {bundle.ListBinCardHeaderTitle_materialId}"/>
                            </f:facet>
                            <h:outputText value="#{item.materialId}"/>
                        </p:column>
                        <f:facet name="footer">
          <p:commandButton id="createButton" icon="ui-icon-  plus"   value="# 
        {bundle.Create}" actionListener="# 
       {binCardHeaderController.prepareCreate}" 
       update=":BinCardHeaderCreateForm" 
       oncomplete="PF('BinCardHeaderCreateDialog').show()"/>
                            <p:commandButton id="viewButton"   icon="ui-icon- 
       search" value="#{bundle.View}" action="# 
      {viewModule.showBinCardHeader('View')}" disabled="#{empty 
      binCardHeaderController.selected}"/>
                            <p:commandButton id="editButton"   icon="ui-icon- 
      pencil" value="#{bundle.Edit}" update=":BinCardHeaderEditForm" 
      oncomplete="PF('BinCardHeaderEditDialog').show()" disabled="#{empty 
      binCardHeaderController.selected}"/>
                            <p:commandButton id="deleteButton" icon="ui-icon- 
      trash"  value="#{bundle.Delete}" actionListener="# 
      {binCardHeaderController.destroy}" update=":growl,datalist" disabled="# 
       {empty binCardHeaderController.selected}"/>
                        </f:facet>
                    </p:dataTable>

现在,如果我单击查看按钮,操作将转到会话作用域托管的名为viewModule的方法showBinCardHeader。

showBinCardHeader外观如​​下

   public String showBinCardHeader(String address) {
        FacesContext context = FacesContext.getCurrentInstance();
        ELContext elContext = context.getELContext();
        BinCardHeaderController binCardHeaderController = 
      (BinCardHeaderController) elContext.getELResolver().getValue(elContext, 
       null, "binCardHeaderController");
        BinCardLineController binCardLineController = (BinCardLineController) 
       elContext.getELResolver().getValue(elContext, null, 
       "binCardLineController");
        binCardLineController.setItems((List<BinCardLine>) 
         binCardHeaderController.getSelected().getBinCardLineCollection());

        return address + "?faces-redirect=true";
      }

该操作将重定向到“查看”页面

BinCardHeader视图页面:

<p:row>
            <p:column>
                 <h:form id="BinCardHeaderViewForm">
                <h:panelGroup id="display">
                    <p:panelGrid columns="2" rendered="#{binCardHeaderController.selected != null}">
                        <h:outputText value="#{bundle.ViewBinCardHeaderLabel_id}"/>
                        <h:outputText value="#{binCardHeaderController.selected.id}" title="#{bundle.ViewBinCardHeaderTitle_id}"/>
                        <h:outputText value="#{bundle.ViewBinCardHeaderLabel_maximumLevel}"/>
                        <h:outputText value="#{binCardHeaderController.selected.maximumLevel}" title="#{bundle.ViewBinCardHeaderTitle_maximumLevel}"/>
                        <h:outputText value="#{bundle.ViewBinCardHeaderLabel_reorderLevel}"/>
                        <h:outputText value="#{binCardHeaderController.selected.reorderLevel}" title="#{bundle.ViewBinCardHeaderTitle_reorderLevel}"/>
                        <h:outputText value="#{bundle.ViewBinCardHeaderLabel_minimumLevel}"/>
                        <h:outputText value="#{binCardHeaderController.selected.minimumLevel}" title="#{bundle.ViewBinCardHeaderTitle_minimumLevel}"/>
                        <h:outputText value="#{bundle.ViewBinCardHeaderLabel_location}"/>
                        <h:outputText value="#{binCardHeaderController.selected.location}" title="#{bundle.ViewBinCardHeaderTitle_location}"/>
                        <h:outputText value="#{bundle.ViewBinCardHeaderLabel_materialId}"/>
                        <h:outputText value="#{binCardHeaderController.selected.materialId}" title="#{bundle.ViewBinCardHeaderTitle_materialId}"/>
                    </p:panelGrid>
                    <p:commandButton value="#{bundle.Close}" onclick="BinCardHeaderViewDialog.hide()"/>
                </h:panelGroup>
            </h:form>
            </p:column>
            <p:column>
                 <h:form id="BinCardLineListForm">
                <p:panel header="#{bundle.ListBinCardLineTitle}">
                    <p:dataTable id="datalist" value="#{binCardLineController.items}" var="item"
                                 selectionMode="single" selection="#{binCardLineController.selected}"
                                 paginator="true"
                                 rowKey="#{item.id}"
                                 rows="10"
                                 rowsPerPageTemplate="10,20,30,40,50"
                                 >

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

                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="#{bundle.ListBinCardLineTitle_id}"/>
                            </f:facet>
                            <h:outputText value="#{item.id}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="#{bundle.ListBinCardLineTitle_date}"/>
                            </f:facet>
                            <h:outputText value="#{item.date}">
                                <f:convertDateTime pattern="MM/dd/yyyy HH:mm:ss" />
                            </h:outputText>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="#{bundle.ListBinCardLineTitle_grnNo}"/>
                            </f:facet>
                            <h:outputText value="#{item.grnNo}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="#{bundle.ListBinCardLineTitle_receivedQty}"/>
                            </f:facet>
                            <h:outputText value="#{item.receivedQty}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="#{bundle.ListBinCardLineTitle_requestNo}"/>
                            </f:facet>
                            <h:outputText value="#{item.requestNo}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="#{bundle.ListBinCardLineTitle_requestedQty}"/>
                            </f:facet>
                            <h:outputText value="#{item.requestedQty}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="#{bundle.ListBinCardLineTitle_balance}"/>
                            </f:facet>
                            <h:outputText value="#{item.balance}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="#{bundle.ListBinCardLineTitle_binCardHeaderId}"/>
                            </f:facet>
                            <h:outputText value="#{item.binCardHeaderId}"/>
                        </p:column>
                        <f:facet name="footer">
                            <p:commandButton id="createButton" icon="ui-icon-plus"   value="#{bundle.Create}" actionListener="#{binCardLineController.prepareCreate}" update=":BinCardLineCreateForm" oncomplete="PF('BinCardLineCreateDialog').show()"/>
                            <p:commandButton id="viewButton"   icon="ui-icon-search" value="#{bundle.View}" update=":BinCardLineViewForm" oncomplete="PF('BinCardLineViewDialog').show()" disabled="#{empty binCardLineController.selected}"/>
                            <p:commandButton id="editButton"   icon="ui-icon-pencil" value="#{bundle.Edit}" update=":BinCardLineEditForm" oncomplete="PF('BinCardLineEditDialog').show()" disabled="#{empty binCardLineController.selected}"/>
                            <p:commandButton id="deleteButton" icon="ui-icon-trash"  value="#{bundle.Delete}" actionListener="#{binCardLineController.destroy}" update=":growl,datalist" disabled="#{empty binCardLineController.selected}"/>
                        </f:facet>
                    </p:dataTable>
                </p:panel>
            </h:form>

            <ui:include src="/store/binCardLine/Create.xhtml"/>
            <ui:include src="/store/binCardLine/Edit.xhtml"/>
            <ui:include src="/store/binCardLine/View.xhtml"/>
            </p:column>
        </p:row>

现在,如果我单击创建按钮,则将创建BinCardLine对话框页面显示在我提交并单击保存后,操作将转到viewModulemanagedBeancreateBinCardLine方法。

createBinCardLine方法:

    public void createBinCardLine() {
           FacesContext context = FacesContext.getCurrentInstance();
           ELContext elContext = context.getELContext();
           BinCardHeaderController binCardHeaderController = 
          (BinCardHeaderController) 
                elContext.getELResolver().getValue(elContext, null, 
          "binCardHeaderController");
           BinCardLineController binCardLineController = 
           (BinCardLineController) 
                elContext.getELResolver().getValue(elContext, null, 
           "binCardLineController");
          binCardLineController.getSelected().setBinCardHeaderId(
          binCardHeaderController.getSelected());

           binCardLineController.create();
           binCardLineController.setItems((List<BinCardLine>) 

       binCardHeaderController.getSelected().getBinCardLineCollection());

     }

问题是在BinCardLine创建视图之后的最终输出页面不显示最新的数据库值,而是显示所有列表的BinCardLine,而我希望它显示的BinCardLine列表仅属于当前选定的BinCardHeader。

注意:两个实体都有控制器,用于创建,编辑,删除动作被发现。我已经在netbeans jsf generate方法中生成了此控制器。我正在编辑它们。

这是到目前为止我尝试过的。有两个名为BinCardHeader和BinCardLine的实体,分别具有一对多关系。下面是BinCardHeader的视图页面。它具有选定的...

java jsf primefaces
1个回答
0
投票

对不起,我没有明确说明我的问题,但是此链接回答了我的问题。我的数据表未刷新的原因是,在创建过程中,该ID默认情况下设置为null,并且在数据表中用作行键。如果有其他解决方法,请分享。 Primefaces: Add a new row to datatable gives error: DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabled

© www.soinside.com 2019 - 2024. All rights reserved.