OptimisticLockException - Edit DataTable with Modal Panel
mechtatel Jan 11, 2010 11:22 PMHi,
I'm trying to display data in dataTable. This data is editable trough Model panel.
The problem appear when I'try to edit a row for seccond time and save the changes, always receive javax.persistence.OptimisticLockException.
I'm using Seam 2.1.2, JBoss AS 5.1, MySQL.
VIEW
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" xmlns:a="http://richfaces.org/a4j" template="layout/maintemplate.xhtml"> <ui:define name="body"> <a:form id="fEditUser"> <rich:dataTable id="dtEditUser" var="webuser" ajaxKeys="#{editUser.keys}" value="#{webusers}" rows="15"> <rich:column> <f:facet name="header">Nombre de usuario</f:facet> <h:outputText value="#{webuser.userName}" /> </rich:column> <rich:column> <f:facet name="header"> <h:outputText value="Editar" /> </f:facet> <a:commandLink value="editar" onclick="#{rich:component('mpEditUser')}.show()"> <f:setPropertyActionListener value="#{webuser}" target="#{editUser.currentRowx}" /> </a:commandLink> </rich:column> </rich:dataTable> </a:form> <rich:modalPanel id="mpEditUser" autosized="true" width="450"> <f:facet name="header"> <h:outputText value="Editar usuario" /> </f:facet> <f:facet name="controls"> <h:panelGroup> <h:graphicImage value="/img/modal/close.png" id="hidelink" styleClass="hidelink" /> <rich:componentControl for="mpEditUser" attachTo="hidelink" operation="hide" event="onclick" /> </h:panelGroup> </f:facet> <h:form> <rich:messages style="color:red;"></rich:messages> <h:panelGrid columns="1"> <a:outputPanel ajaxRendered="true"> <h:panelGrid columns="2"> <h:outputText value="Nombre" /> <h:inputText value="#{editUser.currentRowx.name}" /> </h:panelGrid> </a:outputPanel> <a:commandButton value="Guardar" action="#{editUser.updateRow}" reRender="fEditUser" oncomplete="if (#{facesContext.maximumSeverity==null}) #{rich:component('mpEditUser')}.hide();" /> </h:panelGrid> </h:form> </rich:modalPanel> </ui:define> </ui:composition>
SEAM component
@Name("editUser") @Scope(ScopeType.PAGE) public class EditUser { @In private EntityManager entityManager; @Out(required = false) private List <User> webusers; @Out(required = false) private Set <Integer>keys; @Out(required = false) private User currentRowx; @Factory("webusers") public void getWebUsers() { try { webusers = entityManager.createQuery("from gabino.addcel.entity.User u where u.roll=1 and u.active=true order by u.userName ASC") .getResultList(); } catch(Exception e) { System.out.println("webusers:" + e.toString()); } } @Transactional public void updateRow(){ try { if(getCurrentRowx() != null) { entityManager.merge(getCurrentRowx()); entityManager.flush(); //int index = webusers.indexOf(currentRow); //keys.add(index); } } catch(Exception e) { System.out.println("updateRow EditUser:" + e.toString()); } } public Set<Integer> getKeys() { return keys; } public void setKeys(Set<Integer> keys) { this.keys = keys; } public User getCurrentRowx() { return currentRowx; } public void setCurrentRowx(User currentRowx) { this.currentRowx = currentRowx; } }
persitence.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- Persistence deployment descriptor for dev profile --> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="project_name" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/project_nameDatasource</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <!-- Only relevant if Seam is loading the persistence unit (Java SE bootstrap) --> <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/> <property name="jboss.entity.manager.factory.jndi.name" value="java:/project_name_v0_3EntityManagerFactory"/> </properties> </persistence-unit> </persistence>
components.xml
<?xml version="1.0" encoding="UTF-8"?> <components xmlns="http://jboss.com/products/seam/components" xmlns:core="http://jboss.com/products/seam/core" xmlns:persistence="http://jboss.com/products/seam/persistence" xmlns:drools="http://jboss.com/products/seam/drools" xmlns:bpm="http://jboss.com/products/seam/bpm" xmlns:security="http://jboss.com/products/seam/security" xmlns:mail="http://jboss.com/products/seam/mail" xmlns:web="http://jboss.com/products/seam/web" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.1.xsd http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.1.xsd http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.1.xsd http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.1.xsd http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.1.xsd http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.1.xsd http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd"> <core:init debug="true" jndi-pattern="@jndiPattern@"/> <core:manager concurrent-request-timeout="500" conversation-timeout="120000" conversation-id-parameter="cid" parent-conversation-id-parameter="pid"/> <!-- Make sure this URL pattern is the same as that used by the Faces Servlet --> <web:hot-deploy-filter url-pattern="*.seam"/> <persistence:entity-manager-factory name="entityManagerFactory" persistence-unit-name="project_name" installed="false"/> <persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{entityManagerFactory}" persistence-unit-jndi-name="java:/project_name_v0_3EntityManagerFactory"/> <drools:rule-base name="securityRules"> <drools:rule-files><value>/security.drl</value></drools:rule-files> </drools:rule-base> <security:rule-based-permission-resolver security-rules="#{securityRules}"/> <security:identity authenticate-method="#{authenticator.authenticate}" remember-me="true"/> <event type="org.jboss.seam.security.notLoggedIn"> <action execute="#{redirect.captureCurrentView}"/> </event> <event type="org.jboss.seam.security.loginSuccessful"> <action execute="#{redirect.returnToCapturedView}"/> </event> <mail:mail-session host="localhost" port="25"/> <!-- For use with jBPM pageflow or process management --> <!-- <bpm:jbpm> <bpm:process-definitions></bpm:process-definitions> <bpm:pageflow-definitions></bpm:pageflow-definitions> </bpm:jbpm> --> </components>