Ligação venda com itens de vendas - MySql

eu tenho duas tabelas, VENDAS e ITENS_VENDA, onde vou mostra as duas tabelas abaixo:

[code]
//tabela de vendas
CREATE TABLE VENDAS (
id bigint unsigned NOT NULL auto_increment,
data date NOT NULL,
cliente_id int unsigned NOT NULL,
valor double unsigned NOT NULL,
PRIMARY KEY (id),
CONSTRAINT FK_CLIENTE_ID FOREIGN KEY (cliente_id) REFERENCES CLIENTES (id)
);

//tabela dos itens da venda
CREATE TABLE ITENS_VENDA(
id int unsigned NOT NULL auto_increment,
venda_id int unsigned NOT NULL,
produto_id int unsigned NOT NULL,
quantidade int unsigned NOT NULL,
PRIMARY KEY (id),
CONSTRAINT FK_VENDA_ID FOREIGN KEY (venda_id) REFERENCES VENDAS(id),
CONSTRAINT FK_PRODUTO_ID FOREIGN KEY (produto_id) REFERENCES PRODUTOS(id)
);[/code]

Como faço, para sabe o id da VENDA se eu não cadastrei, por exemplo, para poder preencher a tabela de ITENS_VENDA ?
Também poderiam mostrar como são feitas essas tabelas ? Abraços

Oi,

Como são feitas a tabela? não entendi tua dúvida!

Como tu está utilizando o auto-increment, tu teria que salvar o vendas, primeiro, pegar o registro salvo, o id dele e aí setar no teu item-venda.

Em Java, ao criar um PreparedStatement, tu pode passar um parâmetro, Statement.RETURN_GENERATED_KEYS. Com isso, tu pode pegar o id do registro salvo.

Não sei se era essa tua dúvida…

Fernando

Já se vc quiser usar hibernate, basta vc setar o objeto em edição que o hibernate se vira na hora da gravação para retornar a chave e gravar no banco, sem mto trabalho hehehe

Isso apenas se o banco de dados foi gerado pelo hibernate, afinal, se você percebeu, estas duas linhas na tabela item_venda

CONSTRAINT FK_VENDA_ID FOREIGN KEY (venda_id) REFERENCES VENDAS(id),  
CONSTRAINT FK_PRODUTO_ID FOREIGN KEY (produto_id) REFERENCES PRODUTOS(id)  

são constraints e, sendo assim, não permitem que um item seja cadastrado sem que referencia uma venda existente e que haja uma referência a um produtos existente.

Entendo que um item de venda só pode ser cadastrado numa venda que existe (cupom fiscal, NF, etc) e, ele só irá representar itens (produtos) que estejam cadastrados.

O relacionamento está certo, a tua lógica de cadastro que não está…

estou com o mesmo problema, teria como dar um exemplo de como fazer isso?

Boa noite.

Sou novo aqui no fórum como participante e estou há dias lutando com o hibernate.

Estou utilizando essa mesma ideia no meu desenvolvimento (uma Venda tem vários ItensVenda e uma Compra tem várias EntradaProduto) com JSF + MySQL + Hibernate.

Seguem meus códigos das classes Compra e EntradaProduto:

@Entity
public class Compra implements Serializable{
    private static final long serialVersionUID = 1L;

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

    @Column(nullable=false, name="data_da_entrada")
    @Temporal(javax.persistence.TemporalType.DATE)
    Date dataDaEntrada;
    
    @Column(nullable=false, name="valor_total")
    BigDecimal valorTotal;
    
    @OneToOne(fetch=FetchType.LAZY)
    @ForeignKey(name="fornecedor_fk")
    Fornecedor fornecedor;

    @OneToOne(fetch=FetchType.LAZY)
    @ForeignKey(name="funcionario_fk")
    private Funcionario funcionario;

    @OneToMany(fetch=FetchType.EAGER)
    @Cascade(CascadeType.ALL)
    private List <EntradaProduto> entradas = new ArrayList();
// getters, setters, equals, hashCode, toString...

@Entity
public class EntradaProduto implements Serializable{
    private static final long serialVersionUID = 1L;

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

    @Column(nullable=false, name="preco_de_compra")
    private BigDecimal precoDeCompra;

    @Column(nullable=false)
    private Integer quantidade;

    @ForeignKey(name="produto_fk")
    @OneToOne
    private Produto produto;

// getters, setters, equals, hashCode, toString...

O Hibernate criou para mim as tabelas Compra, EntradaProduto e Compra_EntradaProduto.

Estou usando o trecho de código (num controller) abaixo para cadastrar uma compra no banco; Ele insere direitinho nas tabelas Compra e EntradaProduto mas não insere nada na tabela associativa: (também atualiza os produtos direitinho)

Session session = HibernateUtil.currentSession() == null ? HibernateUtil.openSession() : HibernateUtil.currentSession();

            DAO<Produto> daop = new DAO<Produto>(session, Produto.class);
            ProdutoDAO pdao = new ProdutoDAO(daop, session);
            
            DAO<EntradaProduto> daoe = new DAO<EntradaProduto>(session, EntradaProduto.class);
            EntradaProdutoDAO edao = new EntradaProdutoDAO(daoe, session);
            
            compra.setDataDaEntrada(new Date());
            compra.setEntradas(listaDeEntradas);
            compra.setFornecedor(fornecedor);
            compra.setFuncionario(lc.getFuncionario());

            BigDecimal vTotal = new BigDecimal(BigInteger.ZERO);

            for (int i = 0; i < listaDeEntradas.size(); i++) {
                EntradaProduto ent = listaDeEntradas.get(i);                
                edao.save(ent);                
                Produto p = ent.getProduto();
                Integer q = p.getEstoque() + ent.getQuantidade();
                p.setEstoque(q);                
                pdao.merge(p);
                vTotal = vTotal.add(ent.getPrecoDeCompra().multiply(BigDecimal.valueOf(ent.getQuantidade())));
            }

            DAO<Compra> daoc = new DAO<Compra>(session, Compra.class);
            CompraDAO cdao = new CompraDAO(daoc, session);
            
            compra.setValorTotal(vTotal);

            cdao.save(compra);
            compra = new Compra();
            listaDeEntradas.clear();
            todasAsCompras = null;

Agora, com esse código (num arquivo com main onde populo o banco) ele faz tudo certinho, inclusive na tabela associativa:

EntradaProduto ep1 = new EntradaProduto();
        EntradaProduto ep2 = new EntradaProduto();

        Compra c = new Compra();
        List<EntradaProduto> lista = new ArrayList();

        Fornecedor fo = fodao.load(Long.valueOf("1"));

        ep1.setProduto(pdao.load(Long.valueOf("1")));
        ep1.setQuantidade(10);
        ep1.setPrecoDeCompra(BigDecimal.valueOf(1.00));

        ep2.setProduto(pdao.load(Long.valueOf("2")));
        ep2.setQuantidade(10);
        ep2.setPrecoDeCompra(BigDecimal.valueOf(13.00));

        lista.add(ep1);
        lista.add(ep2);
        
        edao.save(ep1);
        edao.save(ep2);

        c.setDataDaEntrada(new Date());
        c.setEntradas(lista);
        c.setFornecedor(fo);
        c.setFuncionario(fdao.load(Long.valueOf("1")));
        
        BigDecimal vTotal = new BigDecimal(BigInteger.ZERO);
        
        for (int i = 0; i < lista.size(); i++) {
            EntradaProduto item = lista.get(i);
            
            vTotal = vTotal.add(item.getPrecoDeCompra().multiply(BigDecimal.valueOf(item.getQuantidade())));
        }
        
        c.setValorTotal(vTotal);

        cdao.save(c);

        session.flush();

O que estou fazendo de errado?
Estou desesperado!

Grato.

Fala ai Valeio blz??

Vamos la entao:

Para vc pegar o ID de vendas

primeiro: vc abre a conexao, executa o INSERT e depois executa um

depois retorna o resulset com o numero e depois fecha a conexao

Esse LAST_INSERT_ID() eh uma funcao do MySql que retorna o ultimo ID inserido naquela secao apos a abertura da conexao, caso algum outro usuario insira um novo registro essa funcao te garante que ira retornar o id referente a sua insercao. Qualquer duvida acessa a literatura do Mysql a seguir:
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

[quote=FacaNaCaveira]Fala ai Valeio blz??

Vamos la entao:

Para vc pegar o ID de vendas

primeiro: vc abre a conexao, executa o INSERT e depois executa um

depois retorna o resulset com o numero e depois fecha a conexao

Esse LAST_INSERT_ID() eh uma funcao do MySql que retorna o ultimo ID inserido naquela secao apos a abertura da conexao, caso algum outro usuario insira um novo registro essa funcao te garante que ira retornar o id referente a sua insercao. Qualquer duvida acessa a literatura do Mysql a seguir:
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html[/quote]
Com hibernate, caso o generatedValue esteja indicado, ele faz isto sozinho (ou seja, atribui um ID à entity).

[quote]Exelente idéia pra que nao usa Hibernate…Valeu resolveu minha semana…
para quem querer um exemplo pode tentar assim:
[/quote]

[code]import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Main {
private static final String URL = “jdbc:mysql://localhost/testdb”;

private static final String USERNAME = “root”;

private static final String PASSWORD = “”;

public static void main(String[] args) throws Exception {
Class.forName(“com.mysql.jdbc.Driver”);
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);

String insert = "INSERT INTO orders (username, order_date) VALUES ('foobar', '2007-12-13')";
Statement stmt = conn.createStatement();

stmt.executeUpdate(insert, Statement.RETURN_GENERATED_KEYS);

ResultSet keys = stmt.getGeneratedKeys();
int lastKey = 1;
while (keys.next()) {
  lastKey = keys.getInt(1);
}
System.out.println("Last Key: " + lastKey);
conn.close();

}
}[/code]

Oi, estou com o mesmo problema, tenho uma tabela no mysql com os dados da venda e outra tabela com os dados dos itens vendido.
Quando efetuo uma venda o prg grava na tabela venda e tem que gravar o mesmo id da venda na tabela itens vendido para que o relacimento funcione.
Alguém pode me ajudar?.
Estou tendando desta forma

…Meu Codigo
ClasseDao

public String ultimoNumVemda(String id){
String select = “SELECT MAX(ID) FROM TAB_VENDA WHERE ID>?”;
String numVenda="";
try{
PreparedStatement stmt = getConnection().prepareStatement(select);
stmt.setString(1, “0”);
ResultSet rs = stmt.executeQuery();
rs.last();
numVenda=rs.getString(“ID”);
JOptionPane.showMessageDialog(null, numVenda);
}catch(SQLException e){
}
return numVenda;
}

ClasseControle

public String ultimoNumVenda(String id){
VendaDao dao = new VendaDao();
return dao.ultimoNumVemda(id);
}

ClasseView

JOptionPane.showMessageDialog(null,"Numero Ultima Venda: " +vc.ultimoNumVenda(id));

Alguém sabe onde esta o meu erro?

Fico no aguardo…

 String insert = "INSERT INTO orders (username, order_date) VALUES ('foobar', '2007-12-13')";  
    Statement stmt = conn.createStatement();  
  
    stmt.executeUpdate(insert, Statement.RETURN_GENERATED_KEYS);  
  
    ResultSet keys = stmt.getGeneratedKeys();  
    int lastKey = 1;  
    while (keys.next()) {  
      lastKey = keys.getInt(1);  
    }  
    System.out.println("Last Key: " + lastKey);  
    conn.close();