Persistência Hibernate em tabelas relacionadas

2 respostas
barcellosrod

E ae galera, estou com uma dúvida com relação a como persistir os dados no banco utilizando hibernate. Eu tenho seguinte erro:

SEVERE: Entrada em lote 0 insert into public.endereco (fk_estado, rua, numero, bairro, cep, cidade, email, pk_cod_endereco) values (1, Avenida Tijuca, 7777, Santa , 37000150, Porto Seguro, NULL, 0) foi abortada. Chame getNextException para ver a causa.
05/08/2008 08:48:37 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 23505
05/08/2008 08:48:37 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: duplicate key value violates unique constraint "endereco_pkey"
05/08/2008 08:48:37 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:63)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:181)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
        at br.com.sispi.hibernate.dao.GenericDao.salvar(GenericDao.java:28)
        at recarga.jsp.EdicaoCadastroGeral.continuarBotao_action(EdicaoCadastroGeral.java:496)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:623)
        at org.apache.el.parser.AstValue.invoke(AstValue.java:152)
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
        at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
        at com.sun.rave.web.ui.appbase.faces.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
        at javax.faces.component.UICommand.broadcast(UICommand.java:383)
        at com.sun.webui.jsf.component.WebuiCommand.broadcast(WebuiCommand.java:160)
        at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:317)
        at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:292)
        at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:249)
        at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:462)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
        at com.sun.faces.extensions.avatar.lifecycle.PartialTraversalLifecycle.execute(PartialTraversalLifecycle.java:94)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:154)
        at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:260)
        at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:366)
        at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:493)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:267)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:674)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into public.endereco (fk_estado, rua, numero, bairro, cep, cidade, email, pk_cod_endereco) values (1, Avenida Tijuca, 7777, Santa , 37000150, Porto Seguro, NULL, 0) foi abortada. Chame getNextException para ver a causa.
        at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)

Minhas classes estão da seguinte forma:

public class Pessoa implements java.io.Serializable {

	private int pkPessoa;
	private Endereco endereco;
	private String nome;
	private String rg;
	private String cpf;
	private String email;
	private Set pessoaTelefones = new HashSet(0);
	private Set usuarioSistemas = new HashSet(0);
	private Set contatos = new HashSet(0);

	public Pessoa() {
	}

	public Pessoa(int pkPessoa, String nome, String rg, String cpf) {
		this.pkPessoa = pkPessoa;
		this.nome = nome;
		this.rg = rg;
		this.cpf = cpf;
	}

	public Pessoa(int pkPessoa, Endereco endereco, String nome, String rg,
			String cpf, String email, Set pessoaTelefones, Set usuarioSistemas,
			Set contatos) {
		this.pkPessoa = pkPessoa;
		this.endereco = endereco;
		this.nome = nome;
		this.rg = rg;
		this.cpf = cpf;
		this.email = email;
		this.pessoaTelefones = pessoaTelefones;
		this.usuarioSistemas = usuarioSistemas;
		this.contatos = contatos;
	}

	public int getPkPessoa() {
		return this.pkPessoa;
	}
         getters and setters
}
 
public class Endereco implements java.io.Serializable {

	private int pkCodEndereco;
	private Estado estado;
	private String rua;
	private int numero;
	private String bairro;
	private String cep;
	private String cidade;
	private String email;
	private Set pessoas = new HashSet(0);
	private Set empresaTelefones = new HashSet(0);
	private Set endEmpresas = new HashSet(0);

	public Endereco() {
	}

	public Endereco(int pkCodEndereco, Estado estado, String rua, int numero,
			String bairro, String cep, String cidade) {
		this.pkCodEndereco = pkCodEndereco;
		this.estado = estado;
		this.rua = rua;
		this.numero = numero;
		this.bairro = bairro;
		this.cep = cep;
		this.cidade = cidade;
	}

	public Endereco(int pkCodEndereco, Estado estado, String rua, int numero,
			String bairro, String cep, String cidade, String email,
			Set pessoas, Set empresaTelefones, Set endEmpresas) {
		this.pkCodEndereco = pkCodEndereco;
		this.estado = estado;
		this.rua = rua;
		this.numero = numero;
		this.bairro = bairro;
		this.cep = cep;
		this.cidade = cidade;
		this.email = email;
		this.pessoas = pessoas;
		this.empresaTelefones = empresaTelefones;
		this.endEmpresas = endEmpresas;
	}
 getters and setters
}

public class UsuarioSistema implements java.io.Serializable {

	private int pkUsuarioSistema;
	private TipoUsuario tipoUsuario;
	private Pessoa pessoa;
	private Empresa empresa;
	private String usuario;
	private String senha;
	private String PSecreta;
	private String RSecreta;

	public UsuarioSistema() {
	}
        getters and setters

Criei um Dao Generico para realizar um crud e um outro implementando cada classe nesse formato:

public abstract class GenericDao {
    public Session session=null;
    public SessionFactory sessionFactory=null;
           
   public SessionFactory getFactory(){
       this.sessionFactory = HibernateUtil.getSessionFactory();
       return this.sessionFactory;
   }
    
   public void salvar(Object classe)throws Exception{
        this.session = getFactory().openSession();
        this.session.save(classe);
        this.session.flush();
        this.session.close();        
    }
   
    public void atualizar(Object classe)throws Exception{
        this.session = getFactory().openSession();
        this.session.update(classe);
        this.session.flush();
        this.session.close();
    }
    
    public void excluir(Object classe)throws Exception{
        this.session = getFactory().openSession();
        this.session.delete(classe);
        this.session.flush();
        this.session.close();
    }       
}

Porém minha grande duvida é como persistir os dados, visto que como mostrado acima, existem classes que possuem objetos como atributos. o que devo fazer antes, preencher estes objetos e dar um unico save no objeto que contempla os demais? Ou ir dando save em cada um deles??? o que eu fiz foi o seguinte:
Preencho set Telefone e adicionei no objeto Endereco, logo em seguida preenchi o Objeto Pessoa e atribui o Objeto Endereco a mesma, por último preenchi o objeto Usuario e atribui o objeto Pessoa ao mesmo e dei save no objeto usuario, porém aparece o erro citado acima...
Utilizei hibernate tool integrado ao eclipse para gerar os xml de mapeamento, sendo que diversos objetos possuem relação One-to-many e many-to-one.
Se alguem tiver alguma idéia para ajudar, eu agradeço!!!
Abraço a todos!!!

2 Respostas

barcellosrod

Outra dúvida é a seguinte:

Quando declaro tabelas com chaves primarias do tipo serial (postgres), meu mapeamento nos xml deve ser auto incremento tb??? Como gerei os arquivos de mapeamento utilizando hibernate tools e eclipse, o mesmo gereou minhas chaves com o atributo generator em “assigned” . Isto está errado???
Valew galera, qualquer ajuda e bem vinda…

L
duplicate key value violates unique constraint "endereco_pkey"

Valores duplicados,… Ou você não criou no xml de mapeamento da tabela ou no annotations um incremento e está adicionado dois registros com a mesma chave primária, ou você está mapeando errado a chave primária da tabela na configuração do hibernate…

Criado 5 de agosto de 2008
Ultima resposta 5 de ago. de 2008
Respostas 2
Participantes 2