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
@EntitypublicclassCliente{@Id@GeneratedValueprivateLongid;privateStringnome;//getters e seters omitidos}
@EntitypublicclassProduto{@Id@GeneratedValueprivatelongid;privateStringnome;privatedoublevalor;privateintqtd;//getters e seters omitidos}
Classe de pedidos - Modelo
@EntitypublicclassPedido{@Id@GeneratedValueprivatelongid;/* * Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos. */@ManyToOneprivateClientecliente;privateLongnumped;//gettersesetersomitidos
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?publicvoidinserir(Pedidopedido){manager.getTransaction().begin();Queryquery=manager.createNativeQuery("select * from cliente "+"where upper(nome) like upper(:nome)",Cliente.class);query.setParameter("nome","%"+pedido.getCliente().getNome()+"%");Clienteclit=(Cliente)query.getSingleResult();pedido.setCliente(clit);manager.persist(pedido);manager.getTransaction().commit();}
Qual a dificuldade? Basta adicionar os Produtos ao Pedido. E por que usar native Query pra buscar o cliente?
@EntitypublicclassPedido{@Id@GeneratedValueprivatelongid;/* * Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos. */@ManyToOneprivateClientecliente;privateLongnumped;@ManyToManyprivateList<Produto>produtos;}
W
webercondit
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.
D
Demys_Cota
@EntitypublicclassPedido{@Id@GeneratedValueprivatelongid;/* * Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos. */@ManyToOneprivateClientecliente;privateLongnumped;privateList<Produto>listaProdutos;
W
webercondit
Demys Cota:
@EntitypublicclassPedido{@Id@GeneratedValueprivatelongid;/* * Um pedido pertence a apenas um cliente e um cliente faz muitos pedidos. */@ManyToOneprivateClientecliente;privateLongnumped;privateList<Produto>listaProdutos;
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?
F
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.
W
webercondit
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.
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.
D
Demys_Cota
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.
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?
F
fredericomaia10
Uma classe de teste poderia ser assim. Vamos ver se entende melhor:
publicclassPedidoTest{publicvoidinserirTest(){PedidoDaopedidoDao=newPedidoDao();ClienteDaoclienteDao=newClienteDao();ProdutoDaoprodutoDao=newProdutoDao();Clientecliente=clienteDao().buscarPorNome("Frederico Maia Arantes");Produtoproduto1=produtoDao().buscarPorNome("Livro de JPA");Produtoproduto2=produtoDao().buscarPorNome("Livro de Spring");Pedidopedido=newPedido();pedido.setCliente(cliente);pedido.addProduto(pedido1);pedido.addProduto(pedido2);pedidoDao().salvar(pedido);}}
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.
F
fredericomaia10
O salvar do PedidoDao poderia ser o método que o Demys postou acima.
W
webercondit
Agradeço a todos a atenção, Chegando em casa vou fazer o teste e posto aqui.
Vlw