Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Alguem pode me excplicar esse erro?

Ola irei postar minha class aqui.

@Transacional
    public void salvar() {
        if (compra.getCodigo() == null) {
            if (parcelasCompras.size() == 0) {
                Mensagem.mensagemError("Lista das parcelas vazia");
            } else if (compraPagamentos.size() == 0) {
                Mensagem.mensagemError("Lista dos pagamentos vazia");
            } else if (compraProdutos.size() == 0) {
                Mensagem.mensagemError("Lista dos produtos vazia");
            } else {
                compraDao.salvar(compra);
                Compra compraCodigo = compraDao.buscarPorCodigo(compra
                        .getCodigo());
                for (Compra_produto cp : compraProdutos) {
                    cp.setCompra(compraCodigo);
                    Estoque estoque = cp.getProduto().getEstoque();
                    estoque.setQuantidade(cp.getQuantidade()
                            + cp.getProduto().getEstoque().getQuantidade());
                    estoqueDao.atualizar(estoque);
                    compraProdutos = new ArrayList<Compra_produto>();
                    compraProdutoDao.salvar(cp);
                }
                for (Compra_formadepagamento cf : compraPagamentos) {
                    cf.setCompra(compraCodigo);
                    compraPagamentos = new ArrayList<Compra_formadepagamento>();
                    compraFormaPagamentoDao.salvar(cf);
                }
                for (ParcelaCompra pc : parcelasCompras) {
                    pc.setCompra(compraCodigo);
                    parcelasCompras = new ArrayList<ParcelaCompra>();
                    parcelaCompraDao.salvar(pc);
                }
                this.compra = new Compra();
                this.compraProduto = new Compra_produto();
                this.compraPagamento = new Compra_formadepagamento();
                this.parcelaCompra = new ParcelaCompra();
                Mensagem.mensagemInfo("Compra salva com sucesso");
            }
        }
    }

O erro tava dando nessa linha

Estoque estoque = cp.getProduto().getEstoque();
                    estoque.setQuantidade(cp.getQuantidade()
                            + cp.getProduto().getEstoque().getQuantidade());
                    estoqueDao.atualizar(estoque);

o erro é

Hibernate - could not initialize proxy - no Session

Ai vi uma solução e coloquei a anotação assim, na classe produto tem uma classe Estoque, ai fiz

@OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "estoque_codigo")
    private Estoque estoque = new Estoque();

Anotação eager, só uso a lazzy, ai tive que fazer assim, está correto? o porque desse erro?

4 respostas
solução!

Fala Alisson, tudo bem?

Isso acontece porque você está pegando as informações de Estoque dentro da classe produto.

Por padrão, a JPA(hibernate) vai utilizar o comportamento LAZY (preguiçoso) para não ter que pegar os dados de Estoque toda vez que você pega os dados de produto no banco de dados e assim evitar um volume de processamento muito grande. Como vc precisa desses dados, vc fala que quer que o comportamento seja EAGER (ansioso), ou seja, toda vez que os produtos forem carregados no banco, vai carregar os dados de Estoque também.

Espero que tenha ajudado =)

Samir direto ao ponto, esse modo então que ultilizei é correto? só que eu não gosto de usar o eager, teria alguma forma de usar o lazy e arrumar o erro? um select bastava?

Oi Alisson, está correto sim porem custa mais em termos de consumo de memória. Uma pratica melhor para manter o Lazy e evitar todas essa queries geradas pelo eager seriam queries planejadas com JOIN. Isso garante uma performance melhor no banco e evita que sejam feitas várias consultas.

Muito obrigado Samir, abraço