Mini-pdv

Olá galera estou criando um mini-pdv para um estudo orientado na facul.

Seguinte tenho um classe Venda e uma classe vendaDao, estou com duvida em como faço para armazenar uma lista de produtos
no banco(estou usando jdbc).

Minha Classe Venda


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entity;

import java.util.Date;
import java.util.List;

/**
 *
 * @author Informatica
 */
public class Venda {

    private Integer codigo;
    private Date data_venda;
    private Funcionario funcionario;
    private List<Produto> produto;
    private Double total;

    
    
    public Venda(Integer codigo, Date data_venda, Funcionario funcionario, List<Produto> produto, Double total) {
        this.codigo = codigo;
        this.data_venda = data_venda;
        this.funcionario = funcionario;
        this.produto = produto;
        this.total = total;
    }

    
    
    public Venda() {
    }

    @Override
    public String toString() {
        return  codigo +", "+ data_venda +", " +funcionario+ ", " +produto +", "+ total;
    }
    
    
    
    
    
    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public Date getData_venda() {
        return data_venda;
    }

    public void setData_venda(Date data_venda) {
        this.data_venda = data_venda;
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }

    public List<Produto> getProduto() {
        return produto;
    }

    public void setProduto(List<Produto> produto) {
        this.produto = produto;
    }

    public Double getTotal() {
        return total;
    }

    public void setTotal(Double total) {
        this.total = total;
    }
    
    
    
    
    
    
    
    
    
    
}

Como faço para armazenar no banco uma lista de produtos, que foi criado na minha venda?

classe vendaDao

[code]public class VendaDao {

private PreparedStatement pstm;
private ResultSet rs;
private Connection con;

public void create(Venda v) throws SQLException, ClassNotFoundException{
Conversores c = new Conversores();
    con = ConnectionFactory.getConnection();
   
    ProdutoDao dao = new ProdutoDao();
   
    
    pstm = con.prepareStatement("insert into venda values(?,?,?,?)");
    pstm.setObject(1, v.getCodigo());
    pstm.setString(2, c.conversorData("yyyy-MM-dd", new Date()));
    pstm.setObject(3, v.getFuncionario().getCodigo());
    
    
    

    
    
    pstm.execute();
    pstm.close();
    con.close();

}

}

[/code]

ajuda ai gente…

Seria melhor você criar uma tabela no seu bando de dados especificamente para o produto, onde este terá o código da venda, dessa forma, ficaria melhor a manipulação dos dados.

Notei que voce esta utilizando no seu codigo PreparedStatement , Connection, … recomendaria voce utilizar Hibernate ou Eclipse Link com JPA ou JPQL para criar relacoes entre classes que ele construiria automaticamente a tabela no banco e voce poderia salvar com certa facilidade uma lista de objetos.

http://www.guj.com.br/java/103796-o-que-e-hibernatel
http://www.guj.com.br/java/72311-artigo-hibernate-vantagens-e-desvantagens-urgentel
http://www.guj.com.br/java/131357-aprendendo-hibernatel
http://javafree.uol.com.br/artigo/3721/Pequeno-Tutorial-sobre-Hibernate.html

Qualquer duvida, so perguntar aqui no forum.

[]s

Ja trabalhei com hibernate e JPA e isso é trabalho da facul com jdbc.
O problema é que tenho que armazenar na tabela venda uma lista de produtos, sendo que esses produtos são os produtos ja cadastrados no estoque.

Vou ter criar uma outra tabela de produtos é isso ?

sim, seria um relacionamento N pra N, vc teria q normalizar a tabela, e nisso seria criada uma nova tabela com a chave estrangeira do produto e a chave estrangeira da venda

[quote=andrielc]Notei que voce esta utilizando no seu codigo PreparedStatement , Connection, … recomendaria voce utilizar Hibernate ou Eclipse Link com JPA ou JPQL para criar relacoes entre classes que ele construiria automaticamente a tabela no banco e voce poderia salvar com certa facilidade uma lista de objetos.

http://www.guj.com.br/java/103796-o-que-e-hibernatel
http://www.guj.com.br/java/72311-artigo-hibernate-vantagens-e-desvantagens-urgentel
http://www.guj.com.br/java/131357-aprendendo-hibernatel
http://javafree.uol.com.br/artigo/3721/Pequeno-Tutorial-sobre-Hibernate.html

Qualquer duvida, so perguntar aqui no forum.

[]s[/quote]
Como se hibernate e jpa fossem bala de prata, resolvem todos os problemas…

Considere o seguinte, cada venda pode ter 1 ou mais produtos. Considerando apenas produtos, uma venda nunca terá menos de um produto, logo, o relacionamento de venda para produto é 1 venda para um ou vários produtos. Um produto poderá estar em uma ou mais vendas. Não o produto em si, mas o código que o representa. Então, podemos dizer que cada produto pode ser associado a uma ou mais vendas.
Logo, a relação é N : N.
Isso implica em alguns outros detalhes.
Quando você faz uma venda, você tem o código do produto e sua quantidade vendida.
Como vai associar isto?
Bem, eu criaria uma outra classe, ItemVenda, onde colocaria, no mínimo, codProduto e qtdProduto.
Na venda, ao invés de uma lista de produtos, colocaria uma List de ItemVenda.
No banco, teria três tabelas, vendas, produtos e itens_venda. Vendas possui uma PK venda_pk. Produtos possui uma pk, produtos_pk. itens_venda possui uma PK itens_venda_pk e duas FK vendas_fk e produto_fk. itens_fk faz referência à tabela vendas, especificamente a coluna venda_pk. produtos_fk referencia a tabela produtos, mais especificamente a coluna produto_fk.

Seria mais ou menos isso?


seria ± desse jeito ai sim, mas na tabela Venda_Produto eu tiraria o codigo e deixaria uma PK composta por cod_venda e cod_produto, e tb adicionaria um campo qtd

mas acho que o drsmachado faria diferente, acredito que os 2 jeitos funcionem, veja qual lhe serve melhor xD

[quote=yurifw]seria ± desse jeito ai sim, mas na tabela Venda_Produto eu tiraria o codigo e deixaria uma PK composta por cod_venda e cod_produto, e tb adicionaria um campo qtd

mas acho que o drsmachado faria diferente, acredito que os 2 jeitos funcionem, veja qual lhe serve melhor xD[/quote]
Eu não vejo necessidade para uma PK composta. Você tem mais problemas que soluções ao usar uma FK composta, por isso eu prefiro criar uma específica e deixar as FKs isoladas.
Penso que uma PK composta só deve ser utilizada como último recurso mesmo.

[quote=yurifw]seria ± desse jeito ai sim, mas na tabela Venda_Produto eu tiraria o codigo e deixaria uma PK composta por cod_venda e cod_produto, e tb adicionaria um campo qtd

mas acho que o drsmachado faria diferente, acredito que os 2 jeitos funcionem, veja qual lhe serve melhor xD[/quote]

Ta ai gostei! Vou implementar aqui e vou postar o código pra ajudar alguém que tiver a mesmo duvida que eu.

Vlw.

Segui meu diagrama final do banco.


[quote=drsmachado][quote=andrielc]Notei que voce esta utilizando no seu codigo PreparedStatement , Connection, … recomendaria voce utilizar Hibernate ou Eclipse Link com JPA ou JPQL para criar relacoes entre classes que ele construiria automaticamente a tabela no banco e voce poderia salvar com certa facilidade uma lista de objetos.

http://www.guj.com.br/java/103796-o-que-e-hibernatel
http://www.guj.com.br/java/72311-artigo-hibernate-vantagens-e-desvantagens-urgentel
http://www.guj.com.br/java/131357-aprendendo-hibernatel
http://javafree.uol.com.br/artigo/3721/Pequeno-Tutorial-sobre-Hibernate.html

Qualquer duvida, so perguntar aqui no forum.

[]s[/quote]
Como se hibernate e jpa fossem bala de prata, resolvem todos os problemas…[/quote]

Não resolve todos, mas é uma otima ferramenta para pensar em usar, visando a clareza de relacionamento, facilidade na manipulacao de classes … No entanto, esse caso seria uma boa ferramenta para aprender e utilizar.

Sinceramente não entendi a sua critica.

Minha crítica está baseada no que o autor do tópico colocou:

[quote=vicenthy]
Olá galera estou criando um mini-pdv para um estudo orientado na facul.

Seguinte tenho um classe Venda e uma classe vendaDao, estou com duvida em como faço para armazenar uma lista de produtos
no banco(estou usando jdbc).
[/quote]~
Geral acha que só por que está envolvido persistência tem e deve única e exclusivamente ser um caso de estudo, uma regra, uma maldita obrigação, usar a porra do JPA ou Hibernate ou EclipserLink.

Não estou dizendo que seja inútil, mas qualquer framework que visa resolver qualquer problema traz consigo uma série de complexidades que, em muitos casos, pode não ser viável. É a questão do preço a pagar.
Não há dúvidas que essas ferramentas ajudam. Uma retroescavadeira consegue fazer sozinha o trabalho de 20 homens, mas, se eu preciso só de dois pequenos buracos, para colocar as traves, por que vou fazer uma escavação?
Uma vez um professor me disse que a diferença entre obra de arte e desenho comum é saber quando parar, os artistas talentosos sabem quando devem parar, nós, pessoas comuns, não. Aí acabamos destruindo o que seria algo bom.

Aí o cara vai lá e coloca hibernate. Começa a ter problemas com as sessions. Vem, pergunta e a resposta é “que framework você usa para controlar as transações/sessões?” e sugerem Spring Framework. Lá vai o sujeito mudar a estrutura do projeto para adotar Spring. O problema se torna a quantidade de conexões. Sugerem c3p0. Ele precisa criar uma tela para relatórios. Sugerem vRaptor ou JSF 2 com richfaces.
Isso é gerar complexidade sem sentido. “Ah, mas o sistema pode crescer e assim ele precisa estar preparado”.
Aí eu volto à citação que coloquei acima…

[quote=drsmachado]Minha crítica está baseada no que o autor do tópico colocou:

[quote=vicenthy]
Olá galera estou criando um mini-pdv para um estudo orientado na facul.

Seguinte tenho um classe Venda e uma classe vendaDao, estou com duvida em como faço para armazenar uma lista de produtos
no banco(estou usando jdbc).
[/quote]~
Geral acha que só por que está envolvido persistência tem e deve única e exclusivamente ser um caso de estudo, uma regra, uma maldita obrigação, usar a porra do JPA ou Hibernate ou EclipserLink.

Não estou dizendo que seja inútil, mas qualquer framework que visa resolver qualquer problema traz consigo uma série de complexidades que, em muitos casos, pode não ser viável. É a questão do preço a pagar.
Não há dúvidas que essas ferramentas ajudam. Uma retroescavadeira consegue fazer sozinha o trabalho de 20 homens, mas, se eu preciso só de dois pequenos buracos, para colocar as traves, por que vou fazer uma escavação?
Uma vez um professor me disse que a diferença entre obra de arte e desenho comum é saber quando parar, os artistas talentosos sabem quando devem parar, nós, pessoas comuns, não. Aí acabamos destruindo o que seria algo bom.

Aí o cara vai lá e coloca hibernate. Começa a ter problemas com as sessions. Vem, pergunta e a resposta é “que framework você usa para controlar as transações/sessões?” e sugerem Spring Framework. Lá vai o sujeito mudar a estrutura do projeto para adotar Spring. O problema se torna a quantidade de conexões. Sugerem c3p0. Ele precisa criar uma tela para relatórios. Sugerem vRaptor ou JSF 2 com richfaces.
Isso é gerar complexidade sem sentido. “Ah, mas o sistema pode crescer e assim ele precisa estar preparado”.
Aí eu volto à citação que coloquei acima…[/quote]

Concordo plenamente, cada sistema tem sua necessidade e nós temos a obrigação de saber aplicar a ferramenta certa ao requisito certo.