Hibernate nao salva/altera se tiver KeepAlive no jsf

0 respostas
A

Olá pessoal,

Estou com esse problema, se adiciono o a4j:keepalive no jsf minhas operações de insert/update param de funcionar.

Já tentei várias coisas mas nao deu certo, segue meu codigo:

OBS: Se eu remover o a4j:keepAlive o problema nao corre!

JSF

<ui:composition template="/templates/principal.xhtml">
	<head>
		<meta http-equiv="content-Type" content="text/html; charset=utf-8"></meta>
	</head>
	<a4j:keepAlive beanName="contatoMB" />
	<ui:define name="centro">
		
		<a4j:loadScript id="js"
			src="resource:///resources/jquery.maskedinput-1.2.2.js"
			rendered="true" />
		<f:subview id="subviewContato">
			
			<rich:panel styleClass="panelPrincipal">
				<f:facet name="header">
					<h:outputText value="Cadastro || Contato" />
				</f:facet>
				
				<rich:tabPanel styleClass="tabPanel" switchType="client"
					selectedTab="#{contatoMB.selectedTab}" id="tabPrincipal">
					
					<rich:tab styleClass="background" label="Lista" id="tabPesquisa">
						<h:form>
							<rich:toolBar>
								<h:outputLabel value="Pesquisa: " />
								<h:selectOneMenu value="#{contatoMB.pesquisaSelectedField}">
									<f:selectItems value="#{contatoMB.pesquisaFieldList}" />
								</h:selectOneMenu>
								<h:inputText value="#{contatoMB.pesquisaValue}"/>
								<h:commandButton value="Localizar" />
							</rich:toolBar>

							<rich:dataTable id="contatoLista" rows="9" value="#{contatoMB.contatos}" var="contato" >								
								<f:facet name="header">
									<rich:columnGroup>
										<h:column>
											<h:outputText styleClass="headerText" value="Código" />
										</h:column>
										<h:column>
											<h:outputText styleClass="headerText" value="Apelido" />
										</h:column>
										<h:column>
											<h:outputText styleClass="headerText" value="Fone" />
										</h:column>
										<h:column>
											<h:outputText styleClass="headerText" value="CNPJ / CPF" />
										</h:column>
										<h:column>
											<h:outputText styleClass="headerText" value="Ação" />
										</h:column>
									</rich:columnGroup>
								</f:facet>
								<rich:column width="30">
									<h:outputText value="#{contato.id}" />
								</rich:column>
								<rich:column width="400">
									<h:outputText value="#{contato.apelido}" />
								</rich:column>
								<rich:column width="150">
									<h:outputText value="#{contato.fone1}" />
								</rich:column>
								<rich:column width="150">
									<h:outputText value="#{contato.cnpj_cpf}" />
								</rich:column>
								<rich:column width="50" align="center">
									<a4j:commandButton actionListener="#{contatoMB.update}"
										title="Alterar #{contato.id}" reRender="tabPrincipal"
										image="/imagens/ImagensUtilizadas/16x16/viewmag.png">
										<f:param id="editId" value="#{contato.id}" name="y"/>
									</a4j:commandButton>
									<h:commandButton
										image="/imagens/ImagensUtilizadas/16x16/remove.png" 
										onclick="return confirm('Deseja remover o registro: #{contato.apelido} ?');"
										actionListener="#{contatoMB.delete}" id="btn">
										<f:param id="deleteId" value="#{contato.id}" name="x"/>
									</h:commandButton>
								</rich:column>
								<f:facet name="footer">
									<rich:datascroller align="left" for="contatoLista" id="ds1" />
								</f:facet>
							</rich:dataTable>
							
						</h:form>
					</rich:tab>

					<rich:tab id="tabDados" label="Dados">
						<h:form>
							<rich:panelBar height="300" style="border-style:none;">
								<rich:panelBarItem label="">
									<h:inputHidden value="#{contatoMB.contato.id}" />
									<h:inputHidden value="#{contatoMB.contato.insert_usuario}" />
									<h:panelGrid columns="4">
										<h:outputText value="Nome" styleClass="campoObrigatorio" />
										<h:inputText value="#{contatoMB.contato.nome}" size="40" />
										<h:outputText value="Tipo" styleClass="campoObrigatorio" />
										<h:column>
											<h:selectOneMenu id="somPessoa"
												value="#{contatoMB.contato.tipo_pessoa}">
												<f:selectItems value="#{contatoMB.tipoPessoa}" />
											</h:selectOneMenu>
											<rich:message for="somPessoa"></rich:message>
										</h:column>
										<h:outputText value="Apelido" />
										<h:column>
											<h:inputText value="#{contatoMB.contato.apelido}" size="30" />
											<h:graphicImage id="giApelido" styleClass="tooltip-text"
												value="/imagens/ImagensUtilizadas/16x16/preferences_desktop_notification.png">
												<rich:toolTip>
													<span> Informe o nome resumido!<br />
													Ex: Caso o nome seja Petrobras Petróleo Brasileiro S.A. O
													Apelido pode ser Petrobras. </span>
												</rich:toolTip>
											</h:graphicImage>
										</h:column>
										<h:outputText value="Endereço" />
										<h:inputText value="#{contatoMB.contato.endereco}" size="30"
											maxlength="60" />
										<h:outputText value="Número" />
										<h:inputText value="#{contatoMB.contato.numero}" size="10"
											maxlength="10" />
										<h:outputText value="CEP" />
										<h:inputText value="#{contatoMB.contato.cep}" id="intCep">
											<rich:jQuery selector="#intCep" query="mask('99999999')"
												timing="onload" />
										</h:inputText>
										<h:outputText value="Bairro" />
										<h:inputText value="#{contatoMB.contato.bairro}" size="30"
											maxlength="30" />
										<h:outputText value="Cidade" />
										<h:inputText value="#{contatoMB.contato.cidade}" size="30"
											maxlength="60" />
										<h:outputText value="Estado" />
										<h:selectOneMenu value="#{contatoMB.contato.uf_sigla}">
											<f:selectItems value="#{ufMB.combo}" />
										</h:selectOneMenu>
										<h:outputText value="Complemento" />
										<h:inputText value="#{contatoMB.contato.complemento}"
											size="30" maxlength="60" />
										<h:outputText value="Pais" />
										<h:panelGrid columns="3" cellpadding="0" cellspacing="0">
											<a4j:outputPanel layout="block">
												<h:inputText size="1" id="Pais"
													value="#{contatoMB.contato.pais_sigla3}" />
											</a4j:outputPanel>
											
											<rich:suggestionbox height="100" width="250"
												id="suggestionBoxPais" for="Pais" tokens=",[]"
												suggestionAction="#{contatoMB.autocompletePais}" var="pais"
												fetchValue="#{pais.sigla3}">
												<h:column>
													<h:outputText value="#{pais.nome}" />
												</h:column>
												<a4j:support event="onselect" reRender="ottPais">
													<f:setPropertyActionListener value="#{pais.nome}"
														target="#{contatoMB.paisSelecionado}" />
												</a4j:support>
											</rich:suggestionbox>
											<h:outputText id="ottPais"
												value="#{contatoMB.paisSelecionado} #{contatoMB.contato.pais.nome}"
												styleClass="Lookup" />
										</h:panelGrid>											
										<h:outputText value="Fone1" />
										<h:inputText value="#{contatoMB.contato.fone1}" maxlength="20" />
										<h:outputText value="Fone2" />
										<h:inputText value="#{contatoMB.contato.fone2}" maxlength="20" />
										<h:outputText value="Celular" />
										<h:inputText value="#{contatoMB.contato.celular}"
											maxlength="20" />
										<h:outputText value="Fax" />
										<h:inputText value="#{contatoMB.contato.fax}" maxlength="20" />
										<h:outputText value="Nextel" />
										<h:inputText value="#{contatoMB.contato.nextel}"
											maxlength="20" />
										<h:outputText value="E-mail" />
										<h:inputText value="#{contatoMB.contato.email}" size="30" />
										<h:outputText value="Insc. Estadual" />
										<h:inputText value="#{contatoMB.contato.inscricaoestadual}"
											maxlength="12" />
										<h:outputText value="CPNJ/CPF" />
										<h:inputText value="#{contatoMB.contato.cnpj_cpf}"
											id="intCNPJ">
											<rich:jQuery selector="#intCNPJ"
												query="mask('99999999999999')" timing="onload" />
										</h:inputText>
										<h:outputText value="Cargo" />
										<h:inputText value="#{contatoMB.contato.cargo}" size="30"
											maxlength="30" />
										<h:outputText value="WebSite" />
										<h:inputText value="#{contatoMB.contato.website}" size="30"
											maxlength="60" />
										<h:outputText value="Matriz" />
										<h:panelGrid columns="3" cellpadding="0" cellspacing="0">
											<a4j:outputPanel layout="block">
												<h:inputText size="1" id="Matriz"
													value="#{contatoMB.contato.agenda_id}" />
											</a4j:outputPanel>
											
											<rich:suggestionbox height="100" width="250"
												id="suggestionBoxMatriz" for="Matriz" tokens=",[]"
												suggestionAction="#{contatoMB.autocompleteMatriz}" var="contato"
												fetchValue="#{contato.id}">
												<h:column>
													<h:outputText value="#{contato.apelido} - " />
													<h:outputText value="#{contato.cnpj_cpf}" />
												</h:column>
												<a4j:support event="onselect" reRender="ottMatriz">
													<f:setPropertyActionListener value="#{contato.apelido}"
														target="#{contatoMB.matrizSelecionada}" />
												</a4j:support>
											</rich:suggestionbox>
											<h:outputText id="ottMatriz"
												value="#{contatoMB.matrizSelecionada} #{contatoMB.contato.matriz.apelido}"
												styleClass="Lookup" />
										</h:panelGrid>
										<h:outputText value="Observações" />
										<h:inputTextarea value="#{contatoMB.contato.observacoes}"
											cols="47" rows="4" maxlength="200" />

										<h:outputText value="" />
										<h:outputText value="" />

										<h:selectBooleanCheckbox title="Importador" label="Importador"
											value="#{contatoMB.contato.grupo_importador}"
											converter="javax.faces.Boolean">
										</h:selectBooleanCheckbox>
										<h:outputText value="Importador" />
										<h:selectBooleanCheckbox label="Exportador"
											value="#{contatoMB.contato.grupo_exportador}"
											converter="javax.faces.Boolean">
										</h:selectBooleanCheckbox>
										<h:outputText value="Exportador" />
										<h:selectBooleanCheckbox label="Agente de Carga"
											value="#{contatoMB.contato.grupo_agentecarga}"
											converter="javax.faces.Boolean">
										</h:selectBooleanCheckbox>
										<h:outputText value="Agente de Carga" />
										<h:selectBooleanCheckbox label="Transportadora"
											value="#{contatoMB.contato.grupo_transportador_nacional}"
											converter="javax.faces.Boolean">
										</h:selectBooleanCheckbox>
										<h:outputText value="Transportadora" />
										<h:selectBooleanCheckbox label="Despachante"
											value="#{contatoMB.contato.grupo_despachante}"
											converter="javax.faces.Boolean">
										</h:selectBooleanCheckbox>
										<h:outputText value="Despachante" />
										<h:selectBooleanCheckbox label="Transportador Internacional"
											value="#{contatoMB.contato.grupo_transportador_int}"
											converter="javax.faces.Boolean">
										</h:selectBooleanCheckbox>
										<h:outputText value="Transportador" />
										<h:selectBooleanCheckbox label="Armador"
											value="#{contatoMB.contato.grupo_armador}"
											converter="javax.faces.Boolean">
										</h:selectBooleanCheckbox>
										<h:outputText value="Armador" />
										<h:selectBooleanCheckbox label="Agência Marítima"
											value="#{contatoMB.contato.grupo_agenciamaritima}"
											converter="javax.faces.Boolean">
										</h:selectBooleanCheckbox>
										<h:outputText value="Agência Marítima" />
									</h:panelGrid>

									<h:commandButton actionListener="#{contatoMB.insert}"
										value="Novo" />
									<a4j:commandButton actionListener="#{contatoMB.save}" reRender="contatoLista"
										value="Salvar" />
								</rich:panelBarItem>
							</rich:panelBar>
						</h:form>
					</rich:tab>
				</rich:tabPanel>
			</rich:panel>
		</f:subview>
	</ui:define>
	
</ui:composition>

Meu DAO

@SuppressWarnings("serial")
public class Dao<T> implements Serializable{
	private Class<T> persistentClass;
	private Session session;
	
	public Dao(Session session, Class<T> persistentClass){
		this.session = session;
		this.persistentClass = persistentClass;
	}
	
	public void saveOrUpdate(T t){
		session.saveOrUpdate(t);
		session.flush();		
	}
	
	public void delete(T t){
		session.delete(t);
	}
	
	public void save(T t){
		session.save(t);
	}
	
	public void update(T t){
		session.update(t);
	}

	@SuppressWarnings("unchecked")
	public T load(Integer id){
		return (T) session.load(persistentClass, id);
	}
	
	@SuppressWarnings("unchecked")
	public List<T>findAll(String fieldOrder, Boolean orderDesc){
		Criteria c = this.session.createCriteria(persistentClass);
		if(orderDesc == false){
			c.addOrder(Order.asc(fieldOrder));
		}else{
			c.addOrder(Order.desc(fieldOrder));
		}
		
		return c.list();
	}

	@SuppressWarnings("unchecked")
	public List<T> findByName(String fieldName, String fieldValue,String fieldOrder, Integer maxResults){
		Criteria c = this.session.createCriteria(persistentClass);
		c.add(Restrictions.ilike(fieldName, fieldValue,MatchMode.ANYWHERE));
		c.addOrder(Order.asc(fieldOrder));
		if(maxResults == null){
			c.setMaxResults(99999);
		}else{
			c.setMaxResults(maxResults);
		}
		return c.list();
	}

	@SuppressWarnings("unchecked")
	public List<T> findByName(String fieldName, String fieldValue,String fieldOrder, Integer maxResults,MatchMode matchMode){
		Criteria c = this.session.createCriteria(persistentClass);
		c.add(Restrictions.ilike(fieldName, fieldValue,matchMode));
		c.addOrder(Order.asc(fieldOrder));
		if(maxResults == null){
			c.setMaxResults(99999);
		}else{
			c.setMaxResults(maxResults);
		}
		return c.list();
	} 
	
	@SuppressWarnings("unchecked")
	public List<T> findByName(String fieldName, String fieldValue,String fieldOrder,Integer maxResults,MatchMode matchMode, Boolean orderAsc){
		Criteria c = this.session.createCriteria(persistentClass);
		c.add(Restrictions.ilike(fieldName, fieldValue,matchMode));
		
		if(orderAsc == true){
			c.addOrder(Order.asc(fieldOrder));
		}else{
			c.addOrder(Order.desc(fieldOrder));
		}
		
		if(maxResults == null){
			c.setMaxResults(99999);
		}else{
			c.setMaxResults(maxResults);
		}
		return c.list();
	}
	
}

Managed Bean

@SuppressWarnings( { "serial" })
public class ContatoMB extends SuperMB implements Serializable{
	private Contato contato = new Contato();
	private Dao<Contato> dao;
	private Dao<Pais> daoPais;
	private ArrayList<SelectItem> tipoPessoa = new ArrayList<SelectItem>();
	private String matrizSelecionada;
	private String paisSelecionado;
		
	public void setSessao(Session session) {
		this.dao = new Dao<Contato>(session, Contato.class);
		this.daoPais = new Dao<Pais>(session, Pais.class);
	}
	
	public ContatoMB() {
		pesquisaSelectedField = "nome";
		pesquisaFieldList.add(new SelectItem("nome", "Nome"));
		pesquisaFieldList.add(new SelectItem("apelido", "Apelido"));
		pesquisaFieldList.add(new SelectItem("cnpj_cpf", "CNPJ / CPF"));

		tipoPessoa.add(new SelectItem("", "Selecione"));
		tipoPessoa.add(new SelectItem("J", "Júridica"));
		tipoPessoa.add(new SelectItem("F", "Física"));
	}
	
	public List<Contato> getContatos() {

			return dao.findByName("nome", pesquisaValue, "nome", 20,
					MatchMode.START);			
			
	}

	public ArrayList<Contato> autocompleteMatriz(Object suggest) {
           dao.findByName("nome", (String) suggest, "nome", 30, MatchMode.START);
	}

	public ArrayList<Pais> autocompletePais(Object suggest) {
		Session s = HibernateUtil.openSession();		
		ArrayList<Pais> listSelectItem = new ArrayList<Pais>();
		try {
			daoPais = new Dao<Pais>(s,Pais.class);
			listSelectItem = (ArrayList<Pais>) daoPais.findByName("nome",
					(String) suggest, "nome", 10, MatchMode.START);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			s.close();
		}

		return listSelectItem;
	}

	@Override
	public void insert(ActionEvent event) {
		contato = new Contato();
		contato.setId(-1);
		selectedTab = "tabDados";
	}

	public void save(ActionEvent event) {
		dao.saveOrUpdate(contato);
	}
	
	public void pesquisa(ActionEvent event){
		selectedTab = "tabPesquisa";
	}
	
	@Override
	public void update(ActionEvent event) {
			Integer id = (Integer) MyUtil.MyActionEvent(event, "editId");
			contato = (Contato) dao.load(id);

			selectedTab = "tabDados";
			desativarBotaoSalvar = false;
			desativarBotaoNovo = false;
	}
	
	@Override
	public void delete(ActionEvent event) {
		Contato contato = dao.load((Integer) MyUtil.MyActionEvent(event,
				"deleteId"));
		try {
			dao.delete(contato);
		} catch (Exception e) {
			new GeraFacesMessage("Erro");
		}

	}
	
	public Contato getContato() {
		return contato;
	}
	
	public void setContato(Contato contato) {
		this.contato = contato;
	}
	
	public ArrayList<SelectItem> getTipoPessoa() {
		return tipoPessoa;
	}
	
	public void setTipoPessoa(ArrayList<SelectItem> tipoPessoa) {
		this.tipoPessoa = tipoPessoa;
	}

	public String getMatrizSelecionada() {
		return matrizSelecionada;
	}

	public void setMatrizSelecionada(String matrizSelecionada) {
		this.matrizSelecionada = matrizSelecionada;
	}

	public String getPaisSelecionado() {
		return paisSelecionado;
	}

	public void setPaisSelecionado(String paisSelecionado) {
		this.paisSelecionado = paisSelecionado;
	}

	public Dao<Contato> getDao() {
		return dao;
	}

	public void setDao(Dao<Contato> dao) {
		this.dao = dao;
	}

	public Dao<Pais> getDaoPais() {
		return daoPais;
	}

	public void setDaoPais(Dao<Pais> daoPais) {
		this.daoPais = daoPais;
	}

}

Filter

public class HibernateSessionfilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain fc) throws IOException, ServletException {

		Session session = HibernateUtil.openSession();
		
		try{
			session.beginTransaction();
			((HttpServletRequest)req).setAttribute("sessao", session);
			fc.doFilter(req, res);
			
			session.beginTransaction().commit();				
		}catch (Exception e) {
			throw new ServletException(e);			
		}finally{
			session.close();
		}
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

Faces config, onde é injetado a session no MB

<managed-bean>
		<managed-bean-name>contatoMB</managed-bean-name>
		<managed-bean-class>controle.cadastro.ContatoMB</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
		<managed-property>
			<property-name>sessao</property-name>
			<value>#{requestScope.sessao}</value>
		</managed-property>
	</managed-bean>
Criado 11 de junho de 2010
Respostas 0
Participantes 1