这是到目前为止我尝试过的。有两个名为 两个实体都有一个执行创建,编辑,删除操作的控制器。控制器看起来像BinCardHeader
和BinCardLine
的实体,分别具有一对多的关系。下面是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的视图页面。它具有选定的...
对不起,我没有明确说明我的问题,但是此链接回答了我的问题。我的数据表未刷新的原因是,在创建过程中,该ID默认情况下设置为null,并且在数据表中用作行键。如果有其他解决方法,请分享。 Primefaces: Add a new row to datatable gives error: DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabled