União de 3 tabelas com jpa

Boa tarde galera, antes de falarem já tem um post com este assunto. existe mas não explicaram da forma que eu queria.
Sou novato em java, estou apanhando em relacionar 3 tabelas, tenho uma classa chamada pedidos onde consigo relacionar pedido ao cliente, não estou conseguido incluir mais uma classe que seria produtos.
Utilizo JPA.
Vou postar minhas classes p\ vcs entenderem melhor. Me ajudem pessoal.

Classe de clientes - Modelo

@Entity
public class Cliente {

	@Id
	@GeneratedValue
	private Long id;
	private String nome;
	

//getters e seters omitidos
}
@Entity
public class Produto {
	@Id
	@GeneratedValue
	private long id;
	private String nome;
	private double valor;
	private int qtd;
//getters e seters omitidos
}

Classe de pedidos - Modelo

@Entity
public class Pedido {
	@Id
	@GeneratedValue
	private long id;

	/*
	 * Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos.
	 */
	@ManyToOne
	private Cliente cliente;

	private Long numped;

//getters e seters omitidos

Classe PedidoDao - Dao

//Tentei incluir o produto neste metodo, não deu certo;
//tentei tambem criar o inserir2 mas somente para produtos, mas como iria chamar os dois metodos em um unico botão?
public void inserir(Pedido pedido) {
		manager.getTransaction().begin();		
		Query query = manager.createNativeQuery("select * from cliente "
				+ "where upper(nome) like upper(:nome)", Cliente.class);
		query.setParameter("nome", "%" + pedido.getCliente().getNome() + "%");
		Cliente clit = (Cliente) query.getSingleResult();
		pedido.setCliente(clit);
		manager.persist(pedido);
		manager.getTransaction().commit();		

	}

PedidoControl - Controle

public String inserir() {
		pedido.setCliente(cliente);
		pedidoDao.inserir(pedido);
		return null;

	}

Qual a dificuldade? Basta adicionar os Produtos ao Pedido. E por que usar native Query pra buscar o cliente?

[code]@Entity
public class Pedido {
@Id
@GeneratedValue
private long id;

/* 
 * Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos. 
 */  
@ManyToOne  
private Cliente cliente;  

private Long numped;  

@ManyToMany
private List<Produto> produtos;

}
[/code]

Boa tarde Frederico e obrigado pela atenção.
É o seguinte: referente ao mapeamente na entidade não tenho problemas, é no Dao e no controller que não estou conseguindo montar o metodo.
Trabalho com delphi e consego fazer isto tranquilamente, mas com java ando apanhando.
Referente a query, ela compara o nome no banco de dados com o que é digitado pelo usuario.
Você poderia editar meus metodos dao e controller incluindo o produto?
Obrigado.

@Entity  
public class Pedido {  
    @Id  
    @GeneratedValue  
    private long id;  
  
    /* 
     * Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos. 
     */  
    @ManyToOne  
    private Cliente cliente;  
  
    private Long numped; 

    private List<Produto> listaProdutos;

[quote=Demys Cota][code]
@Entity
public class Pedido {
@Id
@GeneratedValue
private long id;

/* 
 * Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos. 
 */  
@ManyToOne  
private Cliente cliente;  

private Long numped; 

private List<Produto> listaProdutos;

[/code][/quote]

Demys o frederico postou, não estou com dificuldades na entidade mas sim no metodo dao e controller como explicado a cima.
Você saberia me ajudar?

O Controller já deve passar o Pedido com todos os atributos populados: cliente, lista de produtos e etc.

O DAO vai apenas salvar, caso esteja usando cascade basta salvar somente o pedido. Se não, salva um por um.

O projeto é web? Posta toda sua classe de controller e dao do Pedido.

[quote=fredericomaia10]O Controller já deve passar o Pedido com todos os atributos populados: cliente, lista de produtos e etc.

O DAO vai apenas salvar, caso esteja usando cascade basta salvar somente o pedido. Se não, salva um por um.

O projeto é web? Posta toda sua classe de controller e dao do Pedido.
[/quote]

Sim é um projeto web,
Dao tenho somente o metodo que postei a cima, na camada de controle so tenho o metodo inserir e os objetos que encapsulei.
Estou estudando, não cheguei a montar um projeto grande, é um cadastro de venda que faz vinculo ao cliente e o produto.
Lembrando que não estou me preocupando com itens quero somente vincular um produto, não uma lista de itens. Só p\ entender como funciona.
Grato.

E isso ai que o fredericomaia10 tá falando.

Com JPA não nos preocupamos muito com SQL, o JPA abstrai o SQL e nos pede Objetc e nos retorna Objet.

Então vc carrega seu Pedido normalmente e passa para o seu JPA que acredito que seja o Hibernate que ele gera o SQL.

só um exemplo

public void salvar(Pedido pedido){

        SessionFactory sf = new Configuration().configure().buildSessionFactory();

       Session session = sf.openSession();

       Transaction tx = session.beginTransaction();
 
       session.save(pedido);

       tx.commit();

       session.close();


}

[quote=Demys Cota]só um exemplo

[code]
public void salvar(Pedido pedido){

    SessionFactory sf = new Configuration().configure().buildSessionFactory();

   Session session = sf.openSession();

   Transaction tx = session.beginTransaction();

   session.save(pedido);

   tx.commit();

   session.close();

}
[/code][/quote]

uai cara, gostei desta forma.
Então você monta este metodo, ele analisa as etidades mapeadas com o relacionamento e já faz o vinculo no banco.
Exemplo: se eu chamar este metodo atraves do controller e no xhtml eu associar a um botão já faz associação?

Uma classe de teste poderia ser assim. Vamos ver se entende melhor:

[code]public class PedidoTest {

public void inserirTest() {

     PedidoDao pedidoDao = new PedidoDao();
     ClienteDao clienteDao = new ClienteDao();
     ProdutoDao produtoDao = new ProdutoDao();

     Cliente cliente = clienteDao().buscarPorNome("Frederico Maia Arantes");         
     Produto produto1 = produtoDao().buscarPorNome("Livro de JPA");
     Produto produto2 = produtoDao().buscarPorNome("Livro de Spring");

     Pedido pedido = new Pedido();
     pedido.setCliente(cliente);
     pedido.addProduto(pedido1);
     pedido.addProduto(pedido2);
        
     pedidoDao().salvar(pedido);
}

}[/code]

Ou seja, o DAO do Pedido vai se preocupar só em salvar o que foi passado pra ele. As camadas acima (Controller ou Service por exemplo) buscam e populam o pedido corretamente.

O salvar do PedidoDao poderia ser o método que o Demys postou acima.

Agradeço a todos a atenção, Chegando em casa vou fazer o teste e posto aqui.
Vlw