25
respostas

Erro com com objeto transient

Boa noite, tudo bem? Eu tava "brincando de testar os codígos" e me veio um erro, acho que eu entendo o porque dele, mais não o motivo dele estar acontecendo! Ok vamos la, irei postar as minhas classes modelo.

@SuppressWarnings("serial")
@Entity
@NamedQueries({
    @NamedQuery(name = "Produto.lista", query = "Select p from Produto p join fetch p.fornecedor"),
    @NamedQuery(name = "Produto.fornecedores", query = "Select f from Fornecedor f")
})
public class Produto implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String descricao;
    private Integer quantidade;
    private BigDecimal preco;
    @ManyToOne
    @JoinColumn(name = "fornecedor_codigo")
    private Fornecedor fornecedor = new Fornecedor();
    @OneToMany(mappedBy = "produto")
    private List<Item> itens = new ArrayList<Item>();
@SuppressWarnings("serial")
@Entity
@NamedQueries({ @NamedQuery(name = "Venda.funcionarios", query = "Select f from Funcionario f")
})
public class Venda implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    @Temporal(TemporalType.DATE)
    private Calendar horario = Calendar.getInstance();
    private BigDecimal valorTotal = BigDecimal.valueOf(0.0D);
    @ManyToOne
    @JoinColumn(name = "funcionario_codigo")
    private Funcionario funcionario = new Funcionario();
    @OneToMany(mappedBy = "venda")
    private List<Item> itens = new ArrayList<Item>();
@SuppressWarnings("serial")
@Entity
public class Item implements  Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private Integer quantidade;
    private BigDecimal valorParcial;

    @ManyToOne
    @JoinColumn(name = "produto_codigo")
    private Produto produto = new Produto();

    @ManyToOne
    @JoinColumn(name = "venda_codigo")
    private Venda venda = new Venda();

Bom como podem ver minhas classes, tem outras mais oque está ocorrendo é o problema nessas aqui. Vou tentar explicar o erro, olhando no banco de dados, minha tabela item tem duas fk, uma de produto e uma de venda. Porem testando meus códigos que andei apreendendo aqui na alura, fiz a minha classe de vendaBean, ontem nessa classe eu faço a relação do produto e item e venda.

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.bercalini.farmacia.anotacao.Transacional;
import br.com.bercalini.farmacia.dao.FuncionarioDao;
import br.com.bercalini.farmacia.dao.ItemDao;
import br.com.bercalini.farmacia.dao.VendaDao;
import br.com.bercalini.farmacia.modelo.Funcionario;
import br.com.bercalini.farmacia.modelo.Item;
import br.com.bercalini.farmacia.modelo.Produto;
import br.com.bercalini.farmacia.modelo.Venda;
import br.com.bercalini.farmacia.util.Mensagem;

@SuppressWarnings("serial")
@Named
@ViewScoped
public class VendaBean implements Serializable {

    @Inject
    private Venda venda;

    @Inject
    private VendaDao vendaDao;

    @Inject
    private Mensagem mensagem;

    @Inject
    private FuncionarioDao funcionarioDao;

    @Inject
    private Item item;

    @Inject
    private ItemDao itemDao;


    private List<Item> itens = new ArrayList<Item>();

    @Transacional
    public void salvar() {
        if (venda.getCodigo() == null) {
            item.setVenda(venda);
             vendaDao.salvar(venda);
             itemDao.salvar(item);
            mensagem.mensagem("VENDA SALVA COM SUCESSO");
        } else {

        }
        this.venda = new Venda();
        this.itens = new ArrayList<Item>();
    }

    public void adicionarVenda(Produto produto) {
        int posicaoEncontrada = -1;
        for (int posicao = 0; posicao < itens.size() && posicaoEncontrada < 0; posicao++) {
            Item temporario = itens.get(posicao);
            if (temporario.getProduto().getCodigo().equals(produto.getCodigo())) {
                posicaoEncontrada = posicao;
            }
        }
        Item item = new Item();
        item.setProduto(produto);
        if (posicaoEncontrada < 0) {
            item.setQuantidade(1);
            item.setValorParcial(produto.getPreco());
            itens.add(item);
        } else {
            Item itemTemporario = itens.get(posicaoEncontrada);
            item.setQuantidade(itemTemporario.getQuantidade() + 1);
            item.setValorParcial(produto.getPreco().multiply(new BigDecimal(item.getQuantidade())));
            itens.set(posicaoEncontrada, item);
        }
        venda.setValorTotal(venda.getValorTotal().add(produto.getPreco()));
    }

    public void remover(Item item) {
        int posicaoEncontrada = -1;
        for (int posicao = 0; posicao < itens.size() && posicaoEncontrada < 0; posicao++) {
            Item temporario = itens.get(posicao);
            if (temporario.getProduto().getCodigo().equals(item.getProduto().getCodigo())) {
                posicaoEncontrada = posicao;
            }
        }
        if(posicaoEncontrada > -1) {
            itens.remove(posicaoEncontrada);
            venda.setValorTotal(venda.getValorTotal().subtract(item.getValorParcial()));
        }
    }

    public void carregarDadosVenda() {
        venda.setHorario(venda.getHorario());
        Funcionario funcionario = funcionarioDao.buscarPorCodigo(1L);
        venda.setFuncionario(funcionario);
        venda.setValorTotal(venda.getValorTotal());
    }


    public List<Funcionario> getListaFuncionarios() {
        return vendaDao.listaFuncionario();
    }

    public List<Produto> getListaProdutos() {
        return vendaDao.listaProduto();
    }

    public Venda getVenda() {
        return venda;
    }

    public void setVenda(Venda venda) {
        this.venda = venda;
    }

    public List<Item> getItens() {
        return itens;
    }

    public void setItens(List<Item> itens) {
        this.itens = itens;
    }

    public Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }

    public ItemDao getItemDao() {
        return itemDao;
    }

    public void setItemDao(ItemDao itemDao) {
        this.itemDao = itemDao;
    }
}

Também irei postar o minha visão aqui.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition template="/template/template.xhtml">
    <ui:define name="conteudo">
        <div class="ui-fluid">
            <h:form id="formularioVendas">
                <p:growl id="mensagem" showDetail="true" sticky="true" />
                <p:dataTable id="tabelaProduto" paginator="true" rows="4"
                    value="#{vendaBean.listaProdutos}" var="produto"
                    emptyMessage="Nenhum produto encontrado">
                    <f:facet name="header">Venda</f:facet>

                    <p:column headerText="Nome">
                        <h:outputText value="#{produto.descricao}" />
                    </p:column>

                    <p:column headerText="Quantidade">
                        <h:outputText value="#{produto.quantidade}" />
                    </p:column>

                    <p:column headerText="Preço">
                        <h:outputText value="#{produto.preco}" />
                    </p:column>

                    <p:column headerText="Fornecedor">
                        <h:outputText value="#{produto.fornecedor.descricao}" />
                    </p:column>

                    <p:column headerText="Opção">
                        <p:panelGrid columns="2">
                            <p:commandButton icon="fa fa-fw fa-plus"
                                title="Adicionar produto"
                                action="#{vendaBean.adicionarVenda(produto)}"
                                update=":formularioVendas:tabelaItens :formularioVendas:valor " />
                        </p:panelGrid>
                    </p:column>
                </p:dataTable>

                <p:separator />

                <p:dataTable id="tabelaItens" value="#{vendaBean.itens}" var="item"
                    paginator="true" rows="3" emptyMessage="Nenhum Item encontrado">
                    <p:column headerText="Produto">
                        <h:outputText value="#{item.produto.descricao}" />
                    </p:column>

                    <p:column headerText="Valor item">
                        <h:outputText value="#{item.valorParcial}" />
                    </p:column>

                    <p:column headerText="Quantidade">
                        <h:outputText value="#{item.quantidade}" />
                    </p:column>

                    <p:column headerText="Fornecedor">
                        <h:outputText value="#{item.produto.fornecedor.descricao}" />
                    </p:column>

                    <p:column headerText="Opção">
                        <p:commandButton icon="fa fa-fw fa-remove"
                            actionListener="#{vendaBean.remover(item)}"
                            update=":formularioVendas:tabelaItens :formularioVendas:pne"
                            title="Remover produto" />
                    </p:column>
                </p:dataTable>

                <h:panelGrid columns="3" id="pne">
                    <p:outputLabel value="Valor Total: " for="valor" />
                    <p:inputText id="valor" value="#{vendaBean.venda.valorTotal}"
                        readonly="true" size="11" />

                    <p:commandButton value="Finalizar venda"
                        actionListener="#{vendaBean.carregarDadosVenda}"
                        oncomplete="PF('finalizar').show();"
                        update=":formularioVendas :dialogo" />
                </h:panelGrid>
            </h:form>

            <p:dialog appendTo="@(body)" header="Finalizar compra"
                closable="true" draggable="true" modal="true" resizable="false"
                widgetVar="finalizar" id="dialogo">
                <h:form>
                    <h:panelGrid columns="2">
                        <p:outputLabel value="Data: " />
                        <p:inputText readonly="true"
                            value="#{vendaBean.venda.horario.time}">
                            <f:convertDateTime pattern="dd/MM/yyyy"
                                timeZone="America/Sao_Paulo" />
                        </p:inputText>

                        <p:outputLabel value="Funcionario: " />
                        <p:inputText readonly="true"
                            value="#{vendaBean.venda.funcionario.nome}" />

                        <p:outputLabel value="Valor total: " />
                        <p:inputText readonly="true" value="#{vendaBean.venda.valorTotal}" />
                        <p:commandButton value="Finalizar"
                            actionListener="#{vendaBean.salvar}" update="formularioVendas"
                            onclick="PF('finalizar').hide();" />
                        <p:commandButton value="Voltar" onclick="PF('finalizar').hide();" />
                    </h:panelGrid>

                </h:form>

            </p:dialog>
        </div>
    </ui:define>
</ui:composition>
</html>

no meu metodo salvar quando clico nele na minha visão o erro é que o produto esta transient.


Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: br.com.bercalini.farmacia.modelo.Item.produto -> br.com.bercalini.farmacia.modelo.Produto
    at org.hibernate.engine.spi.CascadingAction$8.noCascade(CascadingAction.java:380)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:176)
    at org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:160)
    at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:151)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
    ... 49 more

Mais eu não quero salvar o produto novamente! Fiz uma visão separada para adicionar um produto, e to mostrando os meus produtos no meu html de venda. Na hora de apertar o botão só queria salvar a minha venda, e com os meus itens dessa venda! Oque estou errando?

25 respostas

Olá Alisson, tudo bem?

Não sou especialista no hibernate, mas lembro de um projeto que também estava tendo esse problema.

Uma sugestão, tente colocar o CascadeType.ALL no atributo produto da classe Item:

@ManyToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "produto_codigo")
    private Produto produto = new Produto();

Espero que funcione!

Abs

Fala Rafael obrigado por ter respondido, eu ja tinha testado com a

@ManyToOne(cascade = {CascadeType.PERSIST})
@JoinColumn(name = "produto_codigo")
    private Produto produto = new Produto();

quando coloco a minha anotação assim ele me retorna outro erro porque o meu produto tem um fornecedor, mais o outro erro é o mesmo só que dai o meu objeto transient é o fornecedor, ai coloquei o mesmo tipo da anatação ali encima também no meu fornecedor, o erro sumiu e cadastro a venda e seus itens conforme desejado, porem. Colocando anotação assim, ele faz um insert e adiciona na minha tabela fornecedor um fornecedor null e seus atributos nullos, assim como o produto também, faz a inserção e do produto tudo null! Não so muito a favor de usar cascade por esses problemas, teria um jeito correto de se usar sem adicionar esses produto e fornecedor? Ou sem mesmo as anotações teria como? Um outro jeito de settar esse objeto? Da uma olhada no console.

Hibernate: insert into Venda (funcionario_codigo, horario, valorTotal) values (?, ?, ?)
Hibernate: insert into Fornecedor (descricao) values (?)
Hibernate: insert into Produto (descricao, fornecedor_codigo, preco, quantidade) values (?, ?, ?, ?)
Hibernate: insert into Item (produto_codigo, quantidade, valorParcial, venda_codigo) values (?, ?, ?, ?)

Ele faz 4 inserção e oque realmente queria era só o item e a venda! Esperando atenciosamente.

Olá Alisson,

De nada, estamos aqui para ajudá-lo :) Entendo a situação, para ser sincero não sei dizer qual seria a melhor forma nesse caso, vou conversar com alguns colegas e ver a opinião deles. Uma solução que me veio a mente com relação as colunas com valores nulos seria colocar a anotação

@Column(nullable = false)

Espero que essa informação ajude!

Abs

Certo Rafael estou sem minha IDE agora, a verdade tem essa opção que eu nem testei ainda. Seria nas colunas da tabelas essa anotação né? Me lembro que tem como colocar isso no ManyToOne também né? me polparia tempo kkkkk. Tem como né? Depois irei testar e ja te aviso.

Olá Alisson,

Nesse caso, se colocarmos o @Column junto com o @ManyToOne teremos uma AnnotationException. Poderíamos passar o atributo nullable=false no JoinColumn.

Espero que funcione!

Abs

Rafael não funcionou :( será que tem uma outra solução? Quando coloco o meu @Collum(nullable = false) me retorna o erro que a coluna não pode ser nulla.

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'descricao' cannot be null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
    ... 102 more

Olá Alisson,

Vou pesquisar aqui algumas informações adicionais e retorno assim que possível.

Abs

Correto Rafael obrigado pela atenção parceiro, estarei no aguardo! abs

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: br.com.bercalini.farmacia.modelo.Item.produto -> br.com.bercalini.farmacia.modelo.Produto
`

Como é muito código, não parei para analisar todo ele, fiquei só na exception... Sempre que vc for relacionar um objeto com outro, em qq implementação da JPA, vc precisa passar um objeto que esteja managed. Por exemplo, o erro aí é que o produto associado com o item não está gerenciado... Você precisa carregar o produto, pode usar um getReference da vida e passar esse produto para o item. A mesma lógica vale para todos relacionamentos.

Alberto poderia me dar exemplo em código? Porque não faço idéia da onde vem o metodo getReferencia :(

Fala, Alisson! Hehe

Cara... dá uma olhada nisso:

item.setVenda(venda);
vendaDao.salvar(venda);
itemDao.salvar(item);

Já até te falei desse "jeito estruturado" de programar orientado a objetos... kkkkk

Lembre-se de que um objeto venda tem uma lista de item e um item sabe qual o id do seu objeto (dono) venda.

Corrige isso e teu código deve voltar a funcionar.

Abraço.

kkkkkkk fala mano tranquilo? Sim eu me lembro disso, mais o problema é que se eu tirar o.

item.setVenda(venda);
itemDao.salvar(item);

Se eu tirar isso só irá salvar o minha venda, e não meus itens :(

Em relação ao exemplo:

Produto produto = produtoDao.buscaPorId(idDoProduto);
item.setProduto(produto);

Como eu disse, vc precisa buscar um produto gerenciado pelo hibernate... esse é apenas um código de exemplo, mude o que for necessário. Isso vale para todas as relações... quando vc coloca o cascade, vc está tentando se livrar disso, mas também perde o controle fino do que está acontecendo.

Alberto então toda entidade minha por exemplo, um produto tem uma fornecedor correto? Quando for adicionar um produto tenho que setar o fornecedor através do metodo find do produto?Tenho um exemplo aqui em outro projeto kkk. Tava assim.

@Transacional
    public void salvar() {
        if (produto.getCodigo() == null) {
            produtoDao.salvar(produto);
            this.produtos = produtoDao.listaProdutos();
            mensagem.mensagem("Produto adicionado com sucesso");
        } else {
            produtoDao.alterar(produto);
            mensagem.mensagem("Produto alterado com sucesso");
        }
        this.produto = new Produto();
    }
@Transacional
    public void salvar() {
        if (produto.getCodigo() == null) {
            Fornecedor buscaPorId = fornecedorDao.buscarPorCodigo(fornecedor.getCodigo());
            produto.setFornecedor(buscaPorId);
            produtoDao.salvar(produto);
            this.produtos = produtoDao.listaProdutos();
            mensagem.mensagem("Produto adicionado com sucesso");
        } else {
            produtoDao.alterar(produto);
            mensagem.mensagem("Produto alterado com sucesso");
        }
        this.produto = new Produto();
    }

É assim o correto? foi assim que eu entendi

Quando faço assim o meu id vem nulo? não entendo porque estou setando ele.

GRAVE: java.lang.IllegalArgumentException: id to load is required for loading
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:87)
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:59)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2421)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:974)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100)
    at org.jboss.weld.proxies.EntityManager$831880052$Proxy$_$$_WeldClientProxy.find(Unknown Source)
    at br.com.bercalini.farmacia.dao.FornecedorDao.buscarPorCodigo(FornecedorDao.java:26)
    at br.com.bercalini.farmacia.bean.ProdutoBean.salvar(ProdutoBean.java:41)
    at br.com.bercalini.farmacia.bean.ProdutoBean$Proxy$_$$_WeldSubclass.salvar$$super(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:49)
    at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:77)
    at br.com.bercalini.farmacia.gerenciamento.GerenciamentoDeTransacao.gerenciamento(GerenciamentoDeTransacao.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:74)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
    at br.com.bercalini.farmacia.bean.ProdutoBean$Proxy$_$$_WeldSubclass.salvar(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:149)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:814)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Vc entendeu corretamente... A exception nova mudou, tá dizendo que o código tá nulo... Pra vc resolver os problemas, eh importante que leia a exception e tente interpretar. Quando conseguir resolver, nos avise... Não tem mais nenhum problema de hibernate aí.

Alberto estava pegando o id do meu fornecedor, e o correto era a id do produto.getFornecedor().getCodigo() vou testar na minha pagína de vendas e ver, então quando não uso casdade é uma boa pratica em todas as minhas relações quando for adicionar setar pelo metodo busca id? Porque antes eu fazia só assim. produto.setFornecedor(fornecedor); e também dava. isso valé só para adicionar, ou também para excluir ou editar?

Nas outras paginas deu certo. Mais quando faço na minha venda.

@Transacional
    public void salvar() {
        if (venda.getCodigo() == null) {
            Funcionario buscar = funcionarioDao.buscarPorCodigo(venda.getFuncionario().getCodigo());
            venda.setFuncionario(buscar);
            vendaDao.salvar(venda);

            Produto buscarPor = produtoDao.buscaPorId(item.getProduto().getCodigo());
            item.setProduto(buscarPor);
            itemDao.salvar(item);
            mensagem.mensagem("VENDA SALVA COM SUCESSO");
        } else {
GRAVE: java.lang.IllegalArgumentException: id to load is required for loading
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:87)
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:59)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2421)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:974)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100)
    at org.jboss.weld.proxies.EntityManager$831880052$Proxy$_$$_WeldClientProxy.find(Unknown Source)
    at br.com.bercalini.farmacia.dao.ProdutoDao.buscaPorId(ProdutoDao.java:43)
    at br.com.bercalini.farmacia.bean.VendaBean.salvar(VendaBean.java:65)
    at br.com.bercalini.farmacia.bean.VendaBean$Proxy$_$$_WeldSubclass.salvar$$super(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:49)
    at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:77)
    at br.com.bercalini.farmacia.gerenciamento.GerenciamentoDeTransacao.gerenciamento(GerenciamentoDeTransacao.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:74)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
    at br.com.bercalini.farmacia.bean.VendaBean$Proxy$_$$_WeldSubclass.salvar(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:149)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:814)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

novamente e já tentei de tudo agora bugo a mente de verdade

Alguém? :( kk

Tive outra idéia mais não deu...

    @Transacional
    public void salvar() {
        if (venda.getCodigo() == null) {
            Funcionario buscarPorCodigo = funcionarioDao.buscarPorCodigo(venda.getFuncionario().getCodigo());
            venda.setFuncionario(buscarPorCodigo);
            vendaDao.salvar(venda);

            Venda vendaCodigo = vendaDao.buscarPorId(item.getVenda().getCodigo());
            item.setVenda(vendaCodigo);
            itemDao.salvar(item);

            mensagem.mensagem("VENDA SALVA COM SUCESSO");

Estou indo no banco e estou buscando uma venda, e to pegando o id da venda e setando o meu produto. Porem recebo o erro do id novamante!!! Oque estou errando?

an 26, 2017 8:02:30 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
GRAVE: java.lang.IllegalArgumentException: id to load is required for loading
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:87)
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:59)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2421)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:974)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100)
    at org.jboss.weld.proxies.EntityManager$831880052$Proxy$_$$_WeldClientProxy.find(Unknown Source)
    at br.com.bercalini.farmacia.dao.VendaDao.buscarPorId(VendaDao.java:26)
    at br.com.bercalini.farmacia.bean.VendaBean.salvar(VendaBean.java:72)
    at br.com.bercalini.farmacia.bean.VendaBean$Proxy$_$$_WeldSubclass.salvar$$super(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:49)
    at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:77)
    at br.com.bercalini.farmacia.gerenciamento.GerenciamentoDeTransacao.gerenciamento(GerenciamentoDeTransacao.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:74)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
    at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
    at br.com.bercalini.farmacia.bean.VendaBean$Proxy$_$$_WeldSubclass.salvar(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:149)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:814)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Continua dando o mesmo erro.. vc ta passando um id nulo.. precisa achar onde ta nulo.

Mais a lógica ta certa pelo menos? adiciono a venda e depois faço uma busca da venda pelo id, e seto os meus itens correto? até ai está correto? Já pensei de tudo aqui e não sei realmente da onde ta vindo o meu codigo null, sei que é quando seto o meu objeto venda, porém não to vendo o id nullo, porque estou indo até o meu banco de dados e buscando e passando para o setter. E quando faço do tipo.

@Transacional
    public void salvar() {
        if (venda.getCodigo() == null) {
            Funcionario buscarPorCodigo = funcionarioDao.buscarPorCodigo(venda.getFuncionario().getCodigo());
            venda.setFuncionario(buscarPorCodigo);
            vendaDao.salvar(venda);

            Venda vendaCodigo = vendaDao.buscarPorId();
            item.setVenda(venda.getCodigo();
            itemDao.salvar(item);

            mensagem.mensagem("VENDA SALVA COM SUCESSO");

Me retorna outro erro falando que não aceita coluna nulla.

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'produto_codigo' cannot be null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
    ... 88 more

essa linha aqui => item.getVenda().getCodigo(), o getCodigo() ta nulo. Então, vc precisa debugar mais o código, colocar syso em tudo quanto é lugar ou usar o debug do próprio eclispe :). Só dessa maneira para vc ter mais entendimento dos erros.

Ok, mais então a lógica está certa? Irem fazer o curso aqui da alura do debug, pra depois continuar aqui. Fico me perguntando se você já passou por essa situação, parace que quando to mechendo com um objeto é facil cuidar deles, mais quando mistura 2 ou 3 sempre acontece isso, e sinceramente esse erro de agora não entendo o porque.

acho que a lógica está ok..

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software