Annotations one-to-many

5 respostas
T

Boa tarde a todos, comecei a estudar hibernate agora e estou encontrando algumas conplicações , gostaria de saber como resolver esse problema

Tenho duas classes Entity

[size=18]Classe Pessoas[/size]
@Entity
@Table(name="pessoas")
public class Pessoa implements Serializable
{
 @Id
 private int id_pessoa;
 @Column(name="nome_pessoa", length=40)
 private String nome_pessoa;
 @OneToMany(cascade= javax.persistence.CascadeType.ALL, mappedBy = "pessoa")
 @Cascade(CascadeType.ALL)
 private Collection<Endereco> endereco;
[size=18]Classe Endereco[/size]
@Entity
@Table(name="endereco")
public class Endereco implements Serializable {
 @Id
 private int id_endereco;
 @Column(name="desc_endereco", length=50)
 private String desc_endereco;
@ManyToOne
@Cascade(CascadeType.ALL)
private Pessoa pessoa;

Quando eu vou gravar com a classe para gravação:

[size=18]Classe Grava [/size]

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.setNome_pessoa("Diogo22");
         obj_pessoa.setId_pessoa(1);

         Endereco obj_endereco = new Endereco();
         obj_endereco.setId_endereco(1);
         obj_endereco.setDesc_endereco("Rua 1");
         obj_endereco.setPessoa(obj_pessoa);
     
           Endereco obj_endereco2 = new Endereco();
         obj_endereco.setId_endereco(2);
         obj_endereco.setDesc_endereco("Rua 2");
         obj_endereco.setPessoa(obj_pessoa);


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


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

      }catch(Exception erro){
         JOptionPane.showMessageDialog(null, "Erro na inserção: " + erro);
         System.out.println("Er: "+ erro);
      }
  }
}

O endereço é gravado assim no banco
[img]http://img189.imageshack.us/img189/5535/bdendere.jpg[/img]

Ja o cliente é gravado corretamente

[img]http://img51.imageshack.us/img51/4882/bepess.jpg[/img]

Minhas duvidas são:
Porque não esta gravando corretamente?
É necessario ter Many to one e One to many para fazer essa relação de tabela onde uma pessoa pode ter varios endereços?
Existe um meio melhor para fazer isso?

Muito obrigado a todos

5 Respostas

T

[size=18]Tentei fazer outro exemplo com clientes e telefones[/size]

Classe Cliente
@Entity
@Table(name="clientes")
public class Clientes implements Serializable {
    @Id
    private Integer id;
    @Column(name="nome")
    private String nome;
    @OneToMany( mappedBy= "clientes",cascade= javax.persistence.CascadeType.ALL)

    private Set<Telefones> telefones;
Classe Telefone
@Entity
@Table(name="telefones")
public class Telefones {
 @Id
 private Integer Id;
 @Column
 private String telefone;
 @ManyToOne(cascade=javax.persistence.CascadeType.ALL)


 private Clientes clientes;
Classe Cadastrar
public class Cadastrar {
public static void main(String args[])
 {
  AnnotationConfiguration cfg = new AnnotationConfiguration();
  cfg.addAnnotatedClass(Clientes.class);
  cfg.addAnnotatedClass(Telefones.class);
  SessionFactory fabrica = cfg.buildSessionFactory();
  Session sessao = fabrica.openSession();
  Transaction tx_cadast = sessao.beginTransaction();
  Clientes cliente = new Clientes();
  cliente.setId(1);
  cliente.setNome("Diogo");

  Telefones tel1 = new Telefones();
  tel1.setId(1);
  tel1.setTelefone("1111");


  Telefones tel2 = new Telefones();
  tel2.setId(2);
  tel2.setTelefone("2222");

  cliente.setTelefones(new HashSet<Telefones>());
  cliente.getTelefones().add(tel1);
  cliente.getTelefones().add(tel2);
  sessao.save(cliente);
  tx_cadast.commit();
  sessao.close();
 }
}

E No fim nao grava o id do telefone
Alguem me ajuda ://///

[img]http://img96.imageshack.us/img96/2332/dbtel.jpg[/img]

pmlm
tioola:
Endereco obj_endereco = new Endereco();
         obj_endereco.setId_endereco(1);
         obj_endereco.setDesc_endereco("Rua 1");
         obj_endereco.setPessoa(obj_pessoa);
     
          Endereco obj_endereco2 = new Endereco();
         obj_endereco.setId_endereco(2);
         obj_endereco.setDesc_endereco("Rua 2");
         obj_endereco.setPessoa(obj_pessoa);

Oberva bem esta parte do código e descobres o teu problema...

T
pmlm:
tioola:
Endereco obj_endereco = new Endereco();
         obj_endereco.setId_endereco(1);
         obj_endereco.setDesc_endereco("Rua 1");
         obj_endereco.setPessoa(obj_pessoa);
     
          Endereco obj_endereco2 = new Endereco();
         obj_endereco.setId_endereco(2);
         obj_endereco.setDesc_endereco("Rua 2");
         obj_endereco.setPessoa(obj_pessoa);

Oberva bem esta parte do código e descobres o teu problema...

Você esta se refirindo ao meu
obj_endereco.setPessoa(obj_pessoa);
??

Ja tentei tirar e colocar, mas continua a mesma coisa

se não for isso eu ficaria muito grato com sua explicação

pmlm

Tu crias o obj_endereco2 mas depois fazes os sets todos em obj_endereco

T

Entendi o exemplo 1 obrigado.

e quanto ao segundo exemplo, porque não grava o ID?

Criado 30 de junho de 2011
Ultima resposta 2 de jul. de 2011
Respostas 5
Participantes 2