Como fazer um relacionamento muito simples de ManyToMany no Hibernate com Annotations?

4 respostas
S

Olá pessoal,

Quero fazer o clássico exemplo do muitos Pedidos para muitos Produtos usando Hibernate com Annotations

@Entity
public class Produto {
    @Id
    @GeneratedValue
    private int idProduto;
    private String nome;

    @ManyToMany(mappedBy = "produtos")
    private List<Pedido> pedido;

//getters e setter omitidos
@Entity
public class Pedido {
    @Id
    @GeneratedValue
    private int numeroPedido;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataFeita;
    
    @ManyToMany
    @JoinTable(
        name="Pedido_Produto",
        joinColumns=@JoinColumn(name="idProduto"),
        inverseJoinColumns=@JoinColumn(name="numeroPedido")
    )
    private List<Produto> produtos;

//getters e setter omitidos

Ele gera uma tabela intermediária ProdutoPedido automaticamente no banco de dados (usando aquele SchemaExport), mas não consigo preencher ela, cadastro os produtos e pedidos nas suas respectivas tabelas normalmente, mas essa intermediária fica vazia.

O que falta eu fazer?

Nunca consegui fazer isso, seria tão legal conseguir! :smiley:

Abraço!

4 Respostas

S

Consegui!

Parece que não se pode usar List nesse tipo de relacionamento do Hibernate, mudei para Set.
Enfim, futuramente pode ser útil o código:

Pedido:

//imports omitidos

@Entity
public class Pedido {
    @Id
    @GeneratedValue
    private int numeroPedido;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataFeita;
    
    @ManyToMany
    @JoinTable(
        name="Pedido_Produto",
        joinColumns=@JoinColumn(name="numeroPedido"),
        inverseJoinColumns=@JoinColumn(name="idProduto")
    )
    private Set<Produto> produtos;
//getters e setters
}

Produto:

@Entity
public class Produto implements java.io.Serializable {
    @Id
    @GeneratedValue
    private int idProduto;
    private String nome;
    @ManyToMany(mappedBy = "produtos")
    private Set<Pedido> pedido;
//getters e setters

Para criar as tabelas:

//imports omitidos
public class CriaTabelas_Pedido_Produto {
     public static void main(String[] args) {
        AnnotationConfiguration cfg = new AnnotationConfiguration();
        cfg.addAnnotatedClass(Produto.class);
        cfg.addAnnotatedClass(Pedido.class);        
        new SchemaExport(cfg).create(true, true);
    }

}

Muito legal esse Hibernate.

davidbuzatto

Oi Carl :wink:

Então, teoricamente teria que funcionar com List sim. Você está abrindo uma transação antes de persistir os objetos e dando um commit nela?
Tente fazer isso com o List para ver o que acontece.

Realmente usar um Set mapeia melhor o modelo relacional, pois cada linha da tabela (cada instância da classe) é (deve ser pelo menos hehehe) única.
Só tente dar uma testada no que falei, só para desencargo de consciência.

[]´s

S

davidbuzatto:
Oi Carl :wink:

Então, teoricamente teria que funcionar com List sim. Você está abrindo uma transação antes de persistir os objetos e dando um commit nela?
Tente fazer isso com o List para ver o que acontece.

Realmente usar um Set mapeia melhor o modelo relacional, pois cada linha da tabela (cada instância da classe) é (deve ser pelo menos hehehe) única.
Só tente dar uma testada no que falei, só para desencargo de consciência.

[]´s


Oi David,

(Carl Sagan era o cara :smiley: )

Eu faço isso sim, mesmo com a List, abria uma transação no construtor do Dao, e dava um commit depois do save(). Não sei se isso é certo. De qualquer modo eu tinha tentado de todos os modos.

davidbuzatto

Olá!

Realmente não sei pq não funciona então, mas se com o Set está funcionando, beleza :wink:

Abraço!

Criado 12 de setembro de 2009
Ultima resposta 14 de set. de 2009
Respostas 4
Participantes 2