DataModel and Row Unavailable
ssc_ch Jun 28, 2007 3:44 AMI have some problems in using the datamodel.
I have two Tables on my page and i add entries from one table to the 2nd, which works fine.
After adding i should have the possibility to remove entries again from the 2nd table, which works, but only with the first entry..
If i alway delete the first entry until the table is empty this is again no problem, but if i like to delete an entry in the middle or at the end, I get an exception saying the row is unavailable..
My Bean:
@Stateful @Scope(ScopeType.CONVERSATION) @Name("caseAction") public class CaseAction implements ICase,Serializable{ @PersistenceContext private EntityManager em; @In private User authUser; @Logger private Log log; @In private FacesMessages facesMessages; private PersistentFacesState state; @In(create=true) @Out(required=false) private Patient patient; @Out(value="selectedMedCase",required=false) MedCase mcase; @In(create=true) @Out(required=false) private CaseType caseType; @DataModel(value="professionals") private List<HealthProfessional> professionals; @DataModelSelection(value="professionals") @Out(required=false) private HealthProfessional selectedProfessional; @DataModel(value="searchProfessionals") private List<HealthProfessional> searchProfessionals; @DataModelSelection(value="searchProfessionals") @Out(required=false) private HealthProfessional selectedSearchedProfessionals; private String description; public CaseAction(){ } @Begin(join=true) @Factory("searchProfessionals") public void initSearchProfessionals(){ searchProfessionals = em.createQuery("FROM HealthProfessional hp " + "order by hp.lastname").getResultList(); professionals = new ArrayList<HealthProfessional>(); } @End public String create(){ log.info("create") return "/protected/prof/profMyCases.seam"; } public void deleteProf(){ professionals.remove(selectedProfessional); state = PersistentFacesState.getInstance(); log.info("delete Health Professional"); } public void addProf(){ if(!professionals.contains(selectedSearchedProfessionals)){ professionals.add(selectedSearchedProfessionals); } log.info("added Health Professional: #{selectedSearchedProfessionals}"); } public void patientChanged(ValueChangeEvent event){ log.info("patient change event"); } public List<Patient> getMyPatients(){ HealthProfessional prof = (HealthProfessional)authUser; List<Patient> patients; patients = em.createNamedQuery("findAllPatientOfProfessional") .setParameter("prof", prof).getResultList(); return patients; } public List<CaseType> getCaseTypes(){ List<CaseType> types; types = em.createNamedQuery("findAllCaseTypes").getResultList(); return types; } public String getDescription(){ return description; } public void setDescription(String description){ this.description = description; } @Destroy @Remove public void destroy(){ } }
My website:
<?xml version="1.0" encoding="ISO-8859-1" ?> <ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ice="http://www.icesoft.com/icefaces/component" xmlns:s="http://jboss.com/products/seam/taglib" template="../../layout/template.jsp"> <ui:define name="content"> <ice:panelAccordion expanded="true" styleClass="accordion"> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.title']}" /> </f:facet> <ice:form id="form"> <ice:panelGrid columns="3"> <ice:outputText value="#{messages['profNewCase.patient']}" /> <ice:outputText value="#{messages['profNewCase.description']}" /> <ice:outputText value="#{messages['profNewCase.type']}" /> <h:selectOneMenu id="patientListbox" required="true" value="#{patient}" > <s:selectItems value="#{caseAction.myPatients}" var="patient" label="#{patient.firstname} #{patient.lastname}" noSelectionLabel="#{messages['profNewCase.noSelection']}"/> <s:convertEntity /> </h:selectOneMenu> <ice:inputText required="true" value="#{caseAction.description}" /> <h:selectOneMenu id="typeListbox" required="true" value="#{caseType}"> <s:selectItems value="#{caseAction.caseTypes}" var="caseType" label="#{caseType.type}" noSelectionLabel="#{messages['profNewCase.noSelection']}"/> <s:convertEntity /> </h:selectOneMenu> </ice:panelGrid> <ice:outputText value="#{messages['profNewCase.notAdded']}" rendered="#{professionals != null and professionals.rowCount==0}"/> <ice:dataTable var="prof" value="#{professionals}" sortColumn="#{list.sort}" sortAscending="#{list.ascending}" scrollable="#{table.scrollable}" scrollHeight="#{table.scrollableHeight}" columnWidths="150px,150px,150px,150px" rendered="#{professionals.rowCount>0}"> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.responsibleProf']}" /> </f:facet> <ice:column> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.firstname']}" /> </f:facet> <ice:outputText value="#{prof.firstname}" /> </ice:column> <ice:column> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.lastname']}" /> </f:facet> <ice:outputText value="#{prof.lastname}" /> </ice:column> <ice:column> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.state']}" /> </f:facet> <ice:outputText value="#{prof.state}" /> </ice:column> <ice:column> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.edit']}" /> </f:facet> <s:link value="[delete]" action="#{caseAction.deleteProf}" /> </ice:column> </ice:dataTable> <br /> <ice:commandButton type="submit" value="#{messages['profNewCase.create']}" action="#{caseAction.create}" /> </ice:form> <ice:form id="searchForm"> <ice:panelAccordion expanded="true" styleClass="accordion"> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.search']}" /> </f:facet> <ice:outputText value="No Health Professionals Found" rendered="#{searchProfessionals != null and searchProfessionals.rowCount==0}"/> <ice:dataTable var="sProfs" value="#{searchProfessionals}" sortColumn="#{list.sort}" sortAscending="#{list.ascending}" scrollable="#{table.scrollable}" scrollHeight="#{table.scrollableHeight}" columnWidths="150px,150px,150px,150px" rendered="#{searchProfessionals.rowCount>0}"> <ice:column> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.firstname']}" /> </f:facet> <ice:outputText value="#{sProfs.firstname}" /> </ice:column> <ice:column> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.lastname']}" /> </f:facet> <ice:outputText value="#{sProfs.lastname}" /> </ice:column> <ice:column> <f:facet name="header"> <ice:outputText value="#{messages['profNewCase.edit']}" /> </f:facet> <s:link value="[add]" action="#{caseAction.addProf}" /> </ice:column> </ice:dataTable> </ice:panelAccordion> </ice:form> </ice:panelAccordion> </ui:define> </ui:composition>