Note that there are some explanatory texts on larger screens.

plurals
  1. POJSF + Primefaces: Ajax CRUD-Actions in Master-Detail-View only work once per page-load
    primarykey
    data
    text
    <p>I'm using Mojarra 2.0.3 on JBoss AS 6 with Primefaces 2.2.1 + Hibernate.</p> <p>I've got a master-detail-view with p:datatable and p:dialog for Person (prename, lastname).</p> <p>Code of Person.java:</p> <pre><code>@Entity public class Person implements Serializable { private static final long serialVersionUID = 279906432340876832L; @Id @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO) private Long id; private String prename; private String lastname; // getter and setter... } </code></pre> <p>With a "create"-button a new instance can be created, with the "edit"-button, a selected item can be edited.</p> <p>Code of .xhtml:</p> <pre><code>&lt;h:form id="personForm"&gt; &lt;!-- 2 Buttons to open create/edit Dialog --&gt; &lt;p:panel id="tableButtons"&gt; &lt;p:commandButton value="create" action="#{personBean.showCreateView}" update="personForm:detailPanel" oncomplete="personDialog.show()" /&gt; &lt;p:commandButton value="edit" action="#{personBean.showEditView}" update="personForm:detailPanel" oncomplete="personDialog.show()" rendered="#{personBean.rowSelected}" /&gt; &lt;/p:panel&gt; &lt;!-- DataTable for list-View --&gt; &lt;p:dataTable var="item" styleClass="table" value="#{personBean.personList}" id="personTable" paginator="true" selectionMode="single" selection="#{personBean.selectedPerson}" rowSelectListener="#{personBean.select}" onRowSelectUpdate="personForm:tableButtons" rowUnselectListener="#{personBean.unselect}" onRowUnselectUpdate="personForm:tableButtons" rows="10"&gt; &lt;p:column sortBy="#{item.prename}"&gt; &lt;f:facet name="header"&gt; &lt;h:outputText value="prename" /&gt; &lt;/f:facet&gt; &lt;h:outputText value="#{item.prename}" /&gt; &lt;/p:column&gt; &lt;p:column sortBy="#{item.lastname}"&gt; &lt;f:facet name="header"&gt; &lt;h:outputText value="lastname" /&gt; &lt;/f:facet&gt; &lt;h:outputText value="#{item.lastname}" /&gt; &lt;/p:column&gt; &lt;/p:dataTable&gt; &lt;!-- Dialog for detailed-View --&gt; &lt;p:dialog id="personDialog" widgetVar="personDialog"&gt; &lt;p:panel id="detailPanel"&gt; &lt;h:panelGrid cellpadding="4"&gt; &lt;h:outputText value="prename: " /&gt; &lt;h:inputText value="#{personBean.selectedPerson.prename}" /&gt; &lt;h:outputText value="lastname: " /&gt; &lt;h:inputText value="#{personBean.selectedPerson.lastname}" /&gt; &lt;/h:panelGrid&gt; &lt;p:commandButton value="persist" actionListener="#{personBean.persist}" rendered="#{personBean.createView}" update="personForm" oncomplete="personDialog.hide()" /&gt; &lt;p:commandButton value="save" actionListener="#{personBean.merge}" update="personForm" rendered="#{personBean.editView}" oncomplete="personDialog.hide()" /&gt; &lt;/p:panel&gt; &lt;/p:dialog&gt; &lt;/h:form&gt; </code></pre> <p>The managedBean holds 2 boolean attributes createView/editView which appear in the render-attribute of the dialogs commandbuttons, a List for the DataTable, "selectedPerson" for Detail-View and another boolean to trigger edit-Button in case of row-selection in the DataTable.</p> <p>Code of Managed-Bean:</p> <pre><code>@ManagedBean(name = "personBean") @ViewScoped public class PersonMBean { private List&lt;Person&gt; personList; private Person selectedPerson; // row in the table has been selected private boolean rowSelected; // only render the active View private boolean createView; private boolean editView; // ... displayView and more possible @EJB private CRUDService crudService; public PersonMBean() { personList = new ArrayList&lt;Person&gt;(); selectedPerson = new Person(); } // CRUD-options public String persist(ActionEvent actionEvent) { crudService.persist(selectedPerson); return null; } public String merge(ActionEvent actionEvent) { selectedPerson = crudService.merge(selectedPerson); return null; } // switch between Views public String showCreateView() { selectedPerson = new Person(); createView = true; editView = false; return null; } public String showEditView() { createView = false; editView = true; return null; } public List&lt;Person&gt; getPersonList() { return crudService.getAllPerson(); } public Person getSelectedPerson() { if (selectedPerson == null) { selectedPerson = new Person(); } return selectedPerson; } public String select(SelectEvent event) { setRowSelected(true); return null; } public String unselect(UnselectEvent event) { setRowSelected(false); return null; } // getter + setter public void setPersonList(List&lt;Person&gt; personList) {this.personList = personList;} public void setSelectedPerson(Person selectedPerson) {this.selectedPerson = selectedPerson;} public boolean isRowSelected() {return rowSelected;} public void setRowSelected(boolean rowSelected) {this.rowSelected = rowSelected;} public void setCreateView(boolean createView) {this.createView = createView;} public boolean isCreateView() {return createView;} public void setEditView(boolean editView) {this.editView = editView;} public boolean isEditView() {return editView;} } </code></pre> <p>The problem is that while a single create/edit Person is successfull, after that a create-Action inserts an empty row and an edit-Action inserts a row with wrong values. When I reload the page, again the first action is ok, the second one fails... :(</p> <p>I suppose that the PersonMBean.selectedPerson has got an obsolete state but I can not figure it out nor can I find a solution to solve it.</p> <p>p.s. crudService just calls em.persist + em.merge</p> <p>Code of CRUDService:</p> <pre><code>@Stateless public class CRUDService { @PersistenceContext EntityManager em; public &lt;T&gt; T persist(T t) { this.em.persist(t); return t; } public &lt;T&gt; T merge(T t) { return this.em.merge(t); } @SuppressWarnings("unchecked") public List&lt;Person&gt; getAllPerson() { Query q = em.createQuery("from Person"); return q.getResultList(); } } </code></pre> <p>The web.xml looks like this:</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"&gt; &lt;context-param&gt; &lt;param-name&gt;javax.faces.PARTIAL_STATE_SAVING&lt;/param-name&gt; &lt;param-value&gt;false&lt;/param-value&gt; &lt;/context-param&gt; &lt;servlet&gt; &lt;servlet-name&gt;facesServlet&lt;/servlet-name&gt; &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;facesServlet&lt;/servlet-name&gt; &lt;url-pattern&gt;*.xhtml&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; &lt;/web-app&gt; </code></pre> <p>I'm really struggling on this one, hope you can help me.</p> <p>If anything is wrong with formatting / style please let me know so I can update it.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload