[RESOLVIDO] Relacionamento @ManyToMany com JSF + JPA

Pessoal, já pesquisei e não encontrei minha dúvida!

Tenho um relacionamento no meu modelo de banco existente (N,M)

Venda -|-|---------<=–VendaProduto–=>------------|-|-Produto

Na minha aplicação não vou criar uma classe para a tabela VendaProduto e sim uma anotação:

[code]@Entity
public class Venda implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long codigo;

@ManyToMany
@JoinTable(name="VENDA_HAS_PRODUTO",
    joinColumns=@JoinColumn(name="VENDA_CODIGO"),
    inverseJoinColumns=@JoinColumn(name="PRODUTO_CODIGO"))
private List<Produto> produtos;

// gerar os getters e setters

}[/code]

[code]@Entity
public class Produto implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long codigo;

@ManyToMany(mappedBy="produtos")
private List<Venda> vendas;

// gerar os getters e setters

}[/code]

Como faço um método para listar as vendas de um determinado produto no meu GerenciadorVendasBeans ?

Uai…
qual o problema cara?

tentou fazer o xhtml já ?

[quote=d34d_d3v1l]Uai…
qual o problema cara?

tentou fazer o xhtml já ?
[/quote]

Já fiz, antes disso, tenho que fazer um método para listar as vendas de um produto X .

[code]public List listarVendas() {

	Query query = em.createQuery("SELECT ven FROM Venda ven WHERE ................????????? ");
	
	return query.getResultList();

}[/code]

Consegui listar todas as vendas com:

Como eu faço esse método ?
Tem outra forma ?

cara, vc ta com duvida em como fazer a query ? ou como mostra a lista na visualização ?
nao to te entendendo

[quote=d34d_d3v1l]cara, vc ta com duvida em como fazer a query ? ou como mostra a lista na visualização ?
nao to te entendendo[/quote]

Estava com dúvida em fazer o método para mostrar a lista, com a query ou não.

Fiz o seguinte:

[code]public List listarVendas( Produto produto) {

    Query query = em.createQuery("SELECT v.produtos FROM Venda v WHERE v.codigo = " + produto.getId());  
      
    return query.getResultList();  

} [/code]

Para quem vai fazer algo parecido com esse código acima, cuidado com a anotação na propriedade. (fetch = FetchType.LAZY ou FetchType.EAGER)

Então está solucionado ?

coloque [resolvido] no titulo do tópico…

Não entendi mto cara… mas só me diga uma coisa… ONDE coloquei esse método? em qual classe?

[quote=d34d_d3v1l]Então está solucionado ?

coloque [resolvido] no titulo do tópico…

Não entendi mto cara… mas só me diga uma coisa… ONDE coloquei esse método? em qual classe?[/quote]

Em uma classe Controller usando o modelo MVC, onde existe o EntityManager gerenciado pelo container.

[code]@Stateless
@Local(GerenciadorDeVendas.class)
public class GerenciadorDeVendasBeans implements GerenciadorDeVendas{

@PersistenceContext
private EntityManager em;

public List listarVendas( Produto produto) {

    Query query = em.createQuery("SELECT v.produtos FROM Venda v WHERE v.codigo = " + produto.getId());    
        
    return query.getResultList();    

}

// métodos para incluir, alterar…[/code]

[quote=Mathiasr][quote=d34d_d3v1l]Então está solucionado ?

coloque [resolvido] no titulo do tópico…

Não entendi mto cara… mas só me diga uma coisa… ONDE coloquei esse método? em qual classe?[/quote]

Em uma classe Controller usando o modelo MVC, onde existe o EntityManager gerenciado pelo container.

[code]@Stateless
@Local(GerenciadorDeVendas.class)
public class GerenciadorDeVendasBeans implements GerenciadorDeVendas{

@PersistenceContext
private EntityManager em;

public List listarVendas( Produto produto) {

    Query query = em.createQuery("SELECT v.produtos FROM Venda v WHERE v.codigo = " + produto.getId());    
        
    return query.getResultList();    

}

// métodos para incluir, alterar…[/code]
[/quote]

Sim, colocando isso no Controller, vc quebra o MVC.
Pq a ideia do MVC é vc conseguir substituir qqer camada sem afetar a outra.

Uma dica… coloca QUERIES em outra camada (DAO, Repository) para trabalhar apenas com as bases!
Nada de misturar responsabilidades :wink:

mas, siga se vc quiser… n tem nada a ver com o tópico