DataTable - Cell Editing

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();
	}
}

Retirei o @Transaction do GenericDAO e o hibernate parou de disparar o update.
Porém fiquei curioso, alguém sabe por que isso ocorre. Se a OpenSessionInView manterá a session(hibernate) aberta só durante a requisição, após a renderização isso acaba.