Hibernate Auto-Relacionamento

2 respostas
L

Procurei aqui no forum achei algumas coisas, mas não resolveu meu problema…

Tenho a tabela produto:

@Entity
public class Produto{

      @Id
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      private int id
      private String nome;
      @ManyToOne(fetch = FetchType.LAZY) 
      private Produto produto;
      @OneToMany(mappedBy="produto", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
      private List<Produto> produtos;

      //getters and setters

}

Com este modelo acima, a tabela ficaria assim:

id
nome
produto_id

Então tenho meu DAO

public class ProdutoDao {

....

    public void salva() {

         Produto p1 = this.carrega(1);//Produto Pão já cadastrado
         Produto p2 = this.carrega(2);//Produto Salsicha já cadastrado

         Produto produto = new Produto();
         produto.setNome("HotDog");
         
         p1.setProduto(produto);
         p2.setProduto(produto);

         produto.getProdutos().add(p1);
         produto.getProdutos().add(p2);

         this.session.merge(produto);

    }

....

}

Executando dessa forma, a tabela fica assim:

id, nome, produto_id
3, HotDog, NULL

Ele não cria os relacionamento com os produtos 1 e 2, utilizando essas mesmas annotations para relacionamentos normais funciona tranquilamente. Mas nesse auto-Relacionamento não rola, já tentei dar um @JoinColumn(name=“produto_id”) mas não mudou nada.

Alguém já passou por isso e poderia me dar uma luz? Obrigado.

2 Respostas

F

Para ser um autorelacionamento como vc quer e a tabela ficar como vc escreveu

1. id  
   2. nome  
   3. produto_id

Deveria ser uma manyToOne em vez de OneToMany e em vez de um deveria ser:

Private Produto produto;
adrianoneres

É isso mesmo que o fhsantiago disse, não deve ser uma lista, se a tua tabela no banco for do jeito que você colocou.

Mas cara, esse teu método salva() tá assim:

//...
this.session.merge(produto);
//...

para incluir um novo não deveria ser assim?

//...
this.session.persist(produto);
//...
Criado 20 de dezembro de 2010
Ultima resposta 22 de dez. de 2010
Respostas 2
Participantes 3