Olá, então estou com uma aplicação que utiliza
JSF2, PrimeFaces 3.5, Spring(para controlar o IOC e a transações com o OpenSessionInView).
Porém qnd tento atualizar uma coluna do DataTable(primefaces) o método é invocado corretamente, mas passando apenas o oldValue correto. Mas minha dúvida não é esta, e sim que o Hibernate esta disparando um Update por si só. Ai fica a minha dúvida será que é por causa da OpenSessionInview?
Para que o hibernate dispare um Update ele precisa que o elemento esteja em estado gerenciado, como isso pode acontecer…?
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>gestao-servico</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>blitzer</param-value>
</context-param>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<filter>
<filter-name>openSession</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSession</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-config.xml</param-value>
</context-param>
</web-app>
faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
<message-bundle>ValidationMessages</message-bundle>
<resource-bundle>
<base-name>MessageResource</base-name>
<var>msg</var>
</resource-bundle>
</application>
</faces-config>
spring config
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<context:component-scan base-package="br.com.jloja.jsf2.mbeans" />
<context:component-scan base-package="br.com.jloja.dal" />
<context:component-scan base-package="br.com.jloja.services" />
</beans>
pagina xhtml
<h:form id="produtoLista" styleClass="lista">
<p:contextMenu for="dataTable" widgetVar="cMenu">
<p:menuitem value="Edit Cell" icon="ui-icon-search" onclick="produtosTable.showCellEditor();return false;"/>
<p:menuitem value="Hide Menu" icon="ui-icon-close" onclick="cMenu.hide()"/>
</p:contextMenu>
<p:dataTable id="dataTable" var="produto" value="#{produtoMBean.produtos}" editable="true" editMode="cell" widgetVar="produtosTable">
<p:ajax event="cellEdit" listener="#{produtoMBean.onCellEdit}" update="dataTable" />
<p:column headerText="Codigo">
<h:outputText value="#{produto.codigo}" />
</p:column>
<p:column headerText="Nome">
<h:outputText value="#{produto.nome}" />
</p:column>
<p:column headerText="Valor">
<h:outputText value="#{produto.valor}" />
</p:column>
<p:column headerText="Qtd">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{produto.quantidade}" /></f:facet>
<f:facet name="input">
<p:inputText id="modelInput" value="#{produto.quantidade}" style="width:100px;"/>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>
Bean[code]
@Controller
public class ProdutoMBean extends SimpleMBean{
private Produto produto = new Produto();
@Autowired
private ProdutoService produtoService;
public List<Produto> getProdutos(){
return produtoService.getProdutos();
}
public void onCellEdit(CellEditEvent event) {
System.out.println(event.getNewValue());
System.out.println(produto.getQuantidade());
}
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
public void setProdutoService(ProdutoService produtoService) {
this.produtoService = produtoService;
}
[/code]
Service
@Service
public class ProdutoService {
@Autowired @Qualifier("produtoHibernateDAO")
private ProdutoHibernateDAO produtoDAO;
public void setProdutoHibernateDAO(ProdutoHibernateDAO produtoDAO) {
this.produtoDAO = produtoDAO;
}
public List<Produto> getProdutos(){
return produtoDAO.getProdutos();
}
}
Os dois Dao
@Repository
public class ProdutoHibernateDAO {
@Autowired
private GenericDAO<Produto> genericDAO;
public void setGenericDAO(GenericDAO<Produto> genericDAO) {
this.genericDAO = genericDAO;
}
public List<Produto> getProdutos(){
StringBuilder hql = new StringBuilder("from ").append(Produto.class.getName()).append("");
Query query = genericDAO.getSession().createQuery(hql.toString());
return query.list();
}
}
@Repository @Transactional
public class GenericDAO<T extends Serializable> {
private Class<T> clazz;
@Autowired
private SessionFactory sessionFactory;
public void setClazz(Class<T> clazzToSet) {
this.clazz = clazzToSet;
}
public T findOne(final Long id) {
return (T) getSessionFactory().getCurrentSession().load(clazz, id);
}
public List<T> findAll() {
return getSessionFactory().getCurrentSession().createQuery("from " + clazz.getName()).list();
}
public void save(T entity) {
getSessionFactory().getCurrentSession().save(entity);
}
public void update(T entity) {
getSessionFactory().getCurrentSession().merge(entity);
}
public void delete(T entity) {
getSessionFactory().getCurrentSession().delete(entity);
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public Session getSession(){
return getSessionFactory().getCurrentSession();
}
}