Gravar em tabelas separadamente [Resolvido]

2 respostas
F

Tenho um codigo que funciona, ele grava ao mesmo tempo em duas classes, a classe pessoa e a classe endereço.

a classe endereço possui uma chave estrangeira ligada a classe pessoa.

o problema é que eu nao consigo gravar separadamente na tabela de endereço, apenas na tabela de pessoa, tentei criar uma classe para gravar somente na tabela endereço, mas nao consegui fazer funcionar

pois quando ele grava na tabela de endereço ele precisa do valor que esta na tabela Pessoa, mas não consigo passar este valor para a classe endereço, acusa erro falando que ele nao consegue pegar o valor da classe pessoa

alguém pode me dar uma ideia de como posso fazer isso, pois gostaria de gravar individualmente em cada tabela.

classe Pessoa.java
package one_to_many_e_many_to_one;




import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name="pessoas")
public class Pessoa implements Serializable
{
    @Id
    private int id_pessoa;
    @Column(name="nome_pessoa",length=40, nullable=false)
    private String nome_pessoa;
    @OneToMany(mappedBy="pessoa", fetch=FetchType.LAZY)
    @Cascade(CascadeType.ALL)
    private Collection<Endereco> endereco;

    /**
     * @return the id_pessoa
     */
    public int getId_pessoa() {
        return id_pessoa;
    }

    /**
     * @param id_pessoa the id_pessoa to set
     */
    public void setId_pessoa(int id_pessoa) {
        this.id_pessoa = id_pessoa;
    }

    /**
     * @return the nome_pessoa
     */
    public String getNome_pessoa() {
        return nome_pessoa;
    }

    /**
     * @param nome_pessoa the nome_pessoa to set
     */
    public void setNome_pessoa(String nome_pessoa) {
        this.nome_pessoa = nome_pessoa;
    }

    /**
     * @return the endereco
     */
    public Collection<Endereco> getEndereco() {
        return endereco;
    }

    /**
     * @param endereco the endereco to set
     */
    public void setEndereco(Collection<Endereco> endereco) {
        this.endereco = endereco;
    }



}
CLASSE Endereco.java
package one_to_many_e_many_to_one;




import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;


@Entity
@Table(name="endereco")
public class Endereco implements Serializable {
    @Id
    private int id_endereco;
    @Column(name="descricao_end",length=40, nullable=false)
    private String desc_endereco;
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="idPessoa", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Pessoa pessoa;
    /**
     * @return the id_endereco
     */
    public int getId_endereco() {
        return id_endereco;
    }

    /**
     * @param id_endereco the id_endereco to set
     */
    public void setId_endereco(int id_endereco) {
        this.id_endereco = id_endereco;
    }

    /**
     * @return the desc_endereco
     */
    public String getDesc_endereco() {
        return desc_endereco;
    }

    /**
     * @param desc_endereco the desc_endereco to set
     */
    public void setDesc_endereco(String desc_endereco) {
        this.desc_endereco = desc_endereco;
    }

    /**
     * @return the pessoa
     */
    public Pessoa getPessoa() {
        return pessoa;
    }

    /**
     * @param pessoa the pessoa to set
     */
    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

}
CLASSE GravaPessoaEndereço
package one_to_many_e_many_to_one;



import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.*;
import org.hibernate.*;
import org.hibernate.cfg.AnnotationConfiguration;

public class GravaPessoaEndereco
{
     public static void main(String [] args)
     {
         try
         {
             AnnotationConfiguration cfg = new AnnotationConfiguration();
             cfg.addAnnotatedClass(Pessoa.class);
             cfg.addAnnotatedClass(Endereco.class);
             SessionFactory fabrica = cfg.buildSessionFactory();
             Session sessao = fabrica.openSession();
             Transaction tx_pessoa = sessao.beginTransaction();


             Pessoa obj_pessoa = new Pessoa();
             obj_pessoa.setId_pessoa(3);
             obj_pessoa.setNome_pessoa("Neri Aldoir Neitzke");


             Endereco obj_endereco = new Endereco();
             obj_endereco.setId_endereco(1);
             obj_endereco.setDesc_endereco("Av Flores da Cunha");
             obj_endereco.setPessoa(obj_pessoa);


             Endereco obj_endereco2 = new Endereco();
             obj_endereco2.setId_endereco(2);
             obj_endereco2.setDesc_endereco("RFua Felipe Camarao");
             obj_endereco2.setPessoa(obj_pessoa);

             //sessao.save(obj_endereco);
             obj_pessoa.setEndereco(new HashSet<Endereco>());
             obj_pessoa.getEndereco().add(obj_endereco);
             obj_pessoa.getEndereco().add(obj_endereco2);
             
             sessao.save(obj_endereco);

             tx_pessoa.commit();
             sessao.close();

         }
         catch(Exception erro)
         {
             JOptionPane.showMessageDialog(null,"Erro na insers&#1605;o : "+erro);
         }
         //Hibernate: insert into alunos (alu_nome, alu_cidade, alu_fone, alu_curso, alu_codigo) values (?, ?, ?, ?, ?)


     }
}

ps: o codigo acima funciona, mas eu gostaria de gravar meus nomes primeiramente na tabela de pessoas, pra somente depois cadastrar os endereços, mas o problema é que so consigo gravar simultaneamente nas udas tabelas

2 Respostas

kzar.razk

não há necessidade de mapear as duas classes com o hibernate, se já anotou a classe pessoa não anote a classe endereço. Tente entender a anotação @Cascade(CascadeType.ALL)…

F

obrigado pela ajuda kzar.razk,
eu consegui fazer funcionar simplesmente removendo a anotação @Cascade de ambas as classes, agora consigo persistir os dados individualmente em cada tabela

é só usar o

para persistir dados na tabela endereço

e usar o

para persistir para na tabela pessoa

valeu, t+

Criado 17 de fevereiro de 2011
Ultima resposta 17 de fev. de 2011
Respostas 2
Participantes 2