Não consigo excluir[resolvido]

8 respostas
jairodione

Olá Pessoal!

Não estou conseguinfo excluir uma informação no Banco de Dados, no console do eclipse aparece a seguinte informação:

Erro no commit da transação
Could not execute JDBC batch update

segue abaixo arquivo da pagina onde solicito a exclusão da informação;

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="htm"  uri="http://jsftutorials.net/htmLib"%>
<%@ taglib prefix="tr"  uri="http://myfaces.apache.org/trinidad"%>
<%@ taglib prefix="trh"  uri="http://myfaces.apache.org/trinidad/html"%>
<%@ taglib prefix="t"  uri="http://myfaces.apache.org/tomahawk"%>
<%@ taglib prefix="c"  uri="http://java.sun.com/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Alterar/Ecluir Dados do Clientes</title>
<link rel="stylesheet" href="css/principal.css" type="text/css" />
</head>
<body>
	<f:view>
	<htm:div id="mensagens" rendered="#{not empty facesContext.maximumSeverity}">
		<h:panelGrid id="painelMensagens" columns="2">
		<h:graphicImage value="images/delete-comment-red.gif" title="Erro"></h:graphicImage>
		<h:messages></h:messages>
		</h:panelGrid>
	</htm:div><!-- mensagens -->
		<htm:div id="divPrincipal" styleClass="corpoPrincipal">
			<h1>S&S Serviços e Estoque Cliente</h1>
				<htm:div id="divcorpoDireita" styleClass="corpoDireita">
				<htm:div id="previewCliente" styleClass="previewNotaFiscal">
				<t:div id="nrNF">
						<h:outputText styleClass="inputNrNF" value="Alterar ou Excluir Dados do Cliente!" />
						<htm:small style="font-size:10px;"></htm:small>
					</t:div><!-- nrNF -->
						<h:form id="altexDadosCliente">
							<htm:div id="dadosCliente">
								<htm:p>Codigo:</htm:p><htm:big><h:outputText value="#{clienteBean.cnf.cliente.codigo}" /></htm:big>
								<htm:p>Nome/Razão Social:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.nome}" /></htm:big>
								<htm:p>Endereço:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.endereco}" /></htm:big>
								<htm:p>Complemento:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.complemento}" /></htm:big>
								<htm:p>Bairro:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.bairro}" /></htm:big>
								<htm:p>Cidade:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.cidade}" /></htm:big>
								<htm:p>Uf:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.uf}" /></htm:big>
								<htm:p>Cep:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.cep}" /></htm:big>
								<htm:p>Data de Nascimento:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.datanasc}" /></htm:big>
								<htm:p>Cliente Desde:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.desde}" /></htm:big>
								<htm:p>Rg:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.rg}" /></htm:big>
								<htm:p>CPF:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.cpf}" /></htm:big>
								<htm:p>CNPJ:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.cnpj}" /></htm:big>
								<htm:p>Inscrição Estadual:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.insest}" /></htm:big>
								<htm:p>Fone Residencial:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.foneres}" /></htm:big>
								<htm:p>Fone Comercial:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.fonecom}" /></htm:big>
								<htm:p>Fax:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.fax}" /></htm:big>
								<htm:p>Celular:</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.celular}" /></htm:big>
								<htm:p>Contato</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.contato}" /></htm:big>
								<htm:p>Observações</htm:p><htm:big><h:inputText value="#{clienteBean.cnf.cliente.observacao}" /></htm:big>
							</htm:div><!-- dadosCliente -->
							<h:commandButton id="alterarCliente" value="Alterar" action="#{clienteBean.cnf.alteraCliente}" styleClass="panelBotaoEditar"
							onclick="return confirm('Deseja Alterar os Dados do Cliente?');">
							</h:commandButton>
							<h:commandButton id="excluirCliente" value="Excluir" action="#{clienteBean.cnf.excluiCliente}" styleClass="panelBotaoSubtrair"
							onclick="return confirm('Deseja Realmente Excluir este Cliente?');">
							</h:commandButton>
						</h:form><!-- altexDadosClientes -->	
				</htm:div><!-- previewCliente -->
			</htm:div><!-- divcorpoDireita -->
		</htm:div><!-- divPrincipal -->	
	</f:view>
</body>
</html>

arquivo do faces-config.xml:

<navigation-rule>
	<from-view-id>/clientealteraexclui.jsp</from-view-id>
	<navigation-case>
		<from-outcome>altClisucesso</from-outcome>
		<to-view-id>clientealterado.jsp</to-view-id>
	</navigation-case>
	<navigation-case>
		<from-outcome>exClisucesso</from-outcome>
		<to-view-id>clienteexcluido.jsp</to-view-id>
	</navigation-case>
</navigation-rule>

arquivo onde coloquei o metodo para excluir:

package br.com.ses.modelo.bean;

import java.util.Date;

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import br.com.ses.modelo.dao.HibernateDAO;
import br.com.ses.modelo.dao.InterfaceDAO;
import br.com.ses.util.FacesContextUtil;

@Entity(name="cnf_e")
public class CNF {
	private Long numero;
	private CFOp codFiscalOp;
	private Cliente cliente;
	private Date emissao;
	private Date entrada;
	private Double total;
	private String observacao;
	private Set<DNF> detalheNF;
	
	@Id
	public Long getNumero() {
		return numero;
	}
	
	public void setNumero(Long numero) {
		this.numero = numero;
	}
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="cfop_codigo")
	public CFOp getCodFiscalOp() {
		return codFiscalOp;
	}
	
	public void setCodFiscalOp(CFOp codFiscalOp) {
		this.codFiscalOp = codFiscalOp;
	}
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="fornecedor_codigo")
	public Cliente getCliente() {
		return cliente;
	}
	
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
	public Date getEmissao() {
		return emissao;
	}
	
	public void setEmissao(Date emissao) {
		this.emissao = emissao;
	}
	
	public Date getEntrada() {
		return entrada;
	}
	
	public void setEntrada(Date entrada) {
		this.entrada = entrada;
	}
	
	public Double getTotal() {
		return total;
	}
	
	public void setTotal(Double total) {
		this.total = total;
	}
	
	public String getObservacao() {
		return observacao;
	}
	
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	@OneToMany(fetch=FetchType.LAZY, mappedBy="cnf")
	@Cascade(value={CascadeType.SAVE_UPDATE})
	@JoinColumn(name="cnfe_numero", insertable=true, updatable=true)
	public Set<DNF> getDetalheNF() {
		return detalheNF;
	}

	public void setDetalheNF(Set<DNF> detalheNF) {
		this.detalheNF = detalheNF;
	}
	
	public String alteraCliente(){
		InterfaceDAO<Cliente> clienteDAO = new HibernateDAO<Cliente>(Cliente.class, FacesContextUtil.getRequestSession());
		clienteDAO.atualizar(cliente);
						
		return "altClisucesso";
	}
	
	public String excluiCliente(){
		InterfaceDAO<Cliente> clienteDAO = new HibernateDAO<Cliente>(Cliente.class, FacesContextUtil.getRequestSession());
		clienteDAO.excluir(cliente);
						
		return "exClisucesso";
	}
}

gostaria muito de ajuda para solucionar este problema!

Jairo Dione

8 Respostas

drsmachado

O único erro é esta linha, que não diz em qual classe o erro acontece?
Se não doer muito, posta o stackTrace completo

jairodione

não imprime stacktrace no browse. ele me mostra a tela de sucesso “cliente excluido com sucesso”, mas quando vou no BD a informação ainda consta na tabela.

drsmachado

Está olhando para o problema, não para a solução deste.
Quando você executa o código, a IDE ainda “ouve” o que ela diz.
Portanto, quando fizer novamente a exclusão, verifique se houve um erro NO CONSOLE DA IDE.

jairodione

coloquei um try catch no metodo excluiCliente, também fiz um log para saber se ele entra no log. Ele entra no metodo mostra o log e informa a mesma coisa:
codigo da classe onde o metodo excluiCliente se encontra:

package br.com.ses.modelo.bean;

import java.util.Date;

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import br.com.ses.modelo.dao.HibernateDAO;
import br.com.ses.modelo.dao.InterfaceDAO;
import br.com.ses.util.FacesContextUtil;

@Entity(name="cnf_e")
public class CNF {
	private Long numero;
	private CFOp codFiscalOp;
	private Cliente cliente;
	private Date emissao;
	private Date entrada;
	private Double total;
	private String observacao;
	private Set<DNF> detalheNF;
	
	@Id
	public Long getNumero() {
		return numero;
	}
	
	public void setNumero(Long numero) {
		this.numero = numero;
	}
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="cfop_codigo")
	public CFOp getCodFiscalOp() {
		return codFiscalOp;
	}
	
	public void setCodFiscalOp(CFOp codFiscalOp) {
		this.codFiscalOp = codFiscalOp;
	}
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="fornecedor_codigo")
	public Cliente getCliente() {
		return cliente;
	}
	
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
	public Date getEmissao() {
		return emissao;
	}
	
	public void setEmissao(Date emissao) {
		this.emissao = emissao;
	}
	
	public Date getEntrada() {
		return entrada;
	}
	
	public void setEntrada(Date entrada) {
		this.entrada = entrada;
	}
	
	public Double getTotal() {
		return total;
	}
	
	public void setTotal(Double total) {
		this.total = total;
	}
	
	public String getObservacao() {
		return observacao;
	}
	
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	@OneToMany(fetch=FetchType.LAZY, mappedBy="cnf")
	@Cascade(value={CascadeType.SAVE_UPDATE})
	@JoinColumn(name="cnfe_numero", insertable=true, updatable=true)
	public Set<DNF> getDetalheNF() {
		return detalheNF;
	}

	public void setDetalheNF(Set<DNF> detalheNF) {
		this.detalheNF = detalheNF;
	}
	
	public String alteraCliente(){
		InterfaceDAO<Cliente> clienteDAO = new HibernateDAO<Cliente>(Cliente.class, FacesContextUtil.getRequestSession());
		clienteDAO.atualizar(cliente);
						
		return "altClisucesso";
	}
	
	public String excluiCliente(){
		try{
		System.out.println(">>>Metodo acessado!");
		InterfaceDAO<Cliente> clienteDAO = new HibernateDAO<Cliente>(Cliente.class, FacesContextUtil.getRequestSession());
		clienteDAO.excluir(cliente);
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return "exClisucesso";
	}
}

isto é o que aparece no console da IDE:

24/06/2011 14:25:49 org.apache.myfaces.trinidadinternal.config.ConfigParser parseConfigFile
INFO: Trinidad está executando em modo de depuração. Não use em um ambiente de produção. Consulte:/WEB-INF/trinidad-config.xml

Metodo acessado!
Erro no commit da transação
Could not execute JDBC batch update

drsmachado

Opa, já temos onde começar.
Ele não efetua o commit, há algum erro durante o processo. Cabe, agora, descobrir qual erro e por que acontece.

natureza

Coloca um try catch no commit lá no DAO…

Uma pergunta…

Tu ta dando commit na transação???

Nunca se sabe né.

jairodione

Está dando commit na transação de atualização e inserção, mas não consigo na exclusão. Segue abaixo as Classes DAO que utilizo:

package br.com.ses.modelo.dao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import br.com.ses.util.HibernateUtil;

public class HibernateDAO<T> implements InterfaceDAO<T> {
	
	private Class<T> classe;
	protected Session session;

	public HibernateDAO(Class<T> classe, Session session) {
		super();
		this.classe = classe;
		this.session = session;
	}

	@Override
	public void salvar(T bean) {
		session.save(bean);
	}

	@Override
	public void atualizar(T bean) {
		session.update(bean);
	}

	@Override
	public void excluir(T bean) {
		session.delete(bean);
	}

	@Override
	public T getBean(Serializable codigo) {
		T bean = (T) session.get(classe, codigo);
		return bean;
	}

	@Override
	public List<T> getBeans() {
		Criteria crit = session.createCriteria(classe);
		crit.setCacheable(true);
		Long inicio = System.currentTimeMillis();
		List<T> beans = (List<T>) crit.list();
		Long fim = System.currentTimeMillis();
		System.out.println(">>>Tempo total: "+(fim-inicio)+" milisegundos");
		System.out.println(HibernateUtil.getSessionfactory().getStatistics());
		return beans;
	}

	@Override
	public List<T> getBeansByExample(T bean) {
		Example example = getExample(bean);
		return session.createCriteria(classe).add(example).list();
	}
	
	protected Example getExample(T bean){
		Example example = Example.create(bean);
		example.enableLike(MatchMode.START);
		example.ignoreCase();
		example.excludeZeroes();
		return example;
	}

	@Override
	public List<T> getBeansByIds(String atributo, List<Serializable> codigos) {
		try{
			if(codigos.size() == 1){
				List<T> resultado = new ArrayList<T>();
				resultado.add(getBean(codigos.get(0)));
				return resultado;
			}else if(codigos.size() > 1){
				Criteria crit = session.createCriteria(classe);
				crit.add(Restrictions.in("codigo", codigos));
				return crit.list();
			}	
		}catch(Exception e){
			e.printStackTrace();
		}
		return new ArrayList<T>();
	}

	@Override
	public void atualizar(Collection<T> beans) {
		Iterator<T> it = beans.iterator();
		int i = 0;
		while(it.hasNext()){
			session.update(it.next());
			if(i % 20 == 0 || i >= beans.size() - 1){
				session.flush();
				session.clear();
			}
			i++;
		}//fim do laço while
		
	}

}
package br.com.ses.modelo.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

public interface InterfaceDAO<T> {
	void salvar (T bean);
	void atualizar (T bean);
	void excluir (T bean);
	void atualizar(Collection<T> beans);
	T getBean(Serializable codigo);
	List<T> getBeans();
	List<T> getBeansByExample(T bean);
	List<T> getBeansByIds(String atributo, List<Serializable> codigos);
}

agora o arquivo hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="br.com.ses.modelo.bean.Cliente" table="clientes">
		<id name="codigo">
			<generator class="native"></generator>
		</id>
		<property name="nome"></property>
		<property name="endereco"></property>
		<property name="complemento"></property>
		<property name="bairro"></property>
		<property name="cidade"></property>
		<property name="uf"></property>
		<property name="cep"></property>
		<property name="datanasc"></property>
		<property name="desde"></property>
		<property name="rg"></property>
		<property name="cpf"></property>
		<property name="cnpj"></property>
		<property name="insest"></property>
		<property name="foneres"></property>
		<property name="fonecom"></property>
		<property name="fax"></property>
		<property name="celular"></property>
		<property name="contato"></property>
		<property name="observacao"></property>
		<bag name="produtos" table="produtos" inverse="true" lazy="false" fetch="select">
			<key column="fornecedor_codigo"></key>
			<one-to-many class="br.com.ses.modelo.bean.Produto"/>
		</bag>
	</class>
</hibernate-mapping>

fiz uma alteração na classe Bean colocando um list e o erro listado acima que aparece no console desapareceu, mas a informação não foi excluida do BD que é PostGresSQL, segue abaixo o codigo com a alteração que fiz “colocando um List”:

public String excluiCliente(){
		try{
		System.out.println(">>>Metodo acessado!");
		InterfaceDAO<Cliente> clienteDAO = new HibernateDAO<Cliente>(Cliente.class, FacesContextUtil.getRequestSession());
		List<Cliente> clientes = clienteDAO.getBeansByExample(cliente);
		for(Cliente cliente:clientes){
		clienteDAO.excluir(cliente);
		}
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return "exClisucesso";
	}
jairodione

Olá pessoal!

O erro era o seguinte, na classe CNF.java onde tem um mapeamento por annotations descrito abaixo;
anteriormente estava assim:

@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="fornecedor_codigo")
	public Cliente getCliente() {
		return cliente;
	}

agora ficou assim:

@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="fornecedor_codigo")
	@Cascade(value={CascadeType.SAVE_UPDATE})
	public Cliente getCliente() {
		return cliente;
	}

no arquivo de mapeamento cliente.hbm.xml
antes estava assim;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="br.com.ses.modelo.bean.Cliente" table="clientes">
		<id name="codigo">
			<generator class="native"></generator>
		</id>
		<property name="nome"></property>
		<property name="endereco"></property>
		<property name="complemento"></property>
		<property name="bairro"></property>
		<property name="cidade"></property>
		<property name="uf"></property>
		<property name="cep"></property>
		<property name="datanasc"></property>
		<property name="desde"></property>
		<property name="rg"></property>
		<property name="cpf"></property>
		<property name="cnpj"></property>
		<property name="insest"></property>
		<property name="foneres"></property>
		<property name="fonecom"></property>
		<property name="fax"></property>
		<property name="celular"></property>
		<property name="contato"></property>
		<property name="observacao"></property>
		<bag name="produtos" table="produtos" inverse="true" lazy="false" fetch="select">
			<key column="fornecedor_codigo"></key>
			<one-to-many class="br.com.ses.modelo.bean.Produto"/>
		</bag>
	</class>
</hibernate-mapping>

agora ficou assim:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="br.com.ses.modelo.bean.Cliente" table="clientes">
		<id name="codigo">
			<generator class="native"></generator>
		</id>
		<property name="nome"></property>
		<property name="endereco"></property>
		<property name="complemento"></property>
		<property name="bairro"></property>
		<property name="cidade"></property>
		<property name="uf"></property>
		<property name="cep"></property>
		<property name="datanasc"></property>
		<property name="desde"></property>
		<property name="rg"></property>
		<property name="cpf"></property>
		<property name="cnpj"></property>
		<property name="insest"></property>
		<property name="foneres"></property>
		<property name="fonecom"></property>
		<property name="fax"></property>
		<property name="celular"></property>
		<property name="contato"></property>
		<property name="observacao"></property>
		<bag name="produtos" table="produtos" inverse="true" lazy="false" fetch="select" cascade="all">
			<key column="fornecedor_codigo"></key>
			<one-to-many class="br.com.ses.modelo.bean.Produto"/>
		</bag>
	</class>
</hibernate-mapping>

pronto com estas alterações funcionou normalmente!!

Obrigado a todos pela ajuda!!!

Criado 23 de junho de 2011
Ultima resposta 24 de jun. de 2011
Respostas 8
Participantes 3