Erro JPA

galera estou tendo o seguinte erro:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Bean.Produto

quando tento dar um marge. Eu tenho a tabela Produto e Fornecedor e ProdutoFornecedor. A tabela ProdutoFornecedor faz uma relação muitos para muitos entre as tabelas Produto e Fornecedor.

Alguem sabe pq acontece esse erro ?

O erro acontece por que o objeto não está associado a um meio persistente. Se o objeto tem um ID persistente é possível usar o Merge para associa-lo.

Seria mais fácil ajudar se colocasses uma parte do código.

Entidade Produto

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

package Bean;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 *
 * @author rh
 */
@Entity
@Table(name = "produto")
@NamedQueries({@NamedQuery(name = "Produto.findByCodProduto", query = "SELECT p FROM Produto p WHERE p.codProduto = :codProduto"), @NamedQuery(name = "Produto.findByProdDescricao", query = "SELECT p FROM Produto p WHERE p.prodDescricao = :prodDescricao"), @NamedQuery(name = "Produto.findByProdPrincativo", query = "SELECT p FROM Produto p WHERE p.prodPrincativo = :prodPrincativo"), @NamedQuery(name = "Produto.findByProdCultura", query = "SELECT p FROM Produto p WHERE p.prodCultura = :prodCultura"), @NamedQuery(name = "Produto.findByProdFabricante", query = "SELECT p FROM Produto p WHERE p.prodFabricante = :prodFabricante")})
public class Produto implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "cod_produto", nullable = false)
//    Annotation necessaria para campos auto increment quando utilizado hibernate
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer codProduto;
    @Column(name = "prod_descricao", nullable = false)
    private String prodDescricao;
    @Column(name = "prod_princativo", nullable = false)
    private String prodPrincativo;
    @Column(name = "prod_cultura")
    private String prodCultura;
    @Column(name = "prod_fabricante")
    private String prodFabricante;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "codProduto")
    private Collection<ProdutoFornecedor> produtoFornecedorCollection;
    @JoinColumn(name = "tox_codigo", referencedColumnName = "tox_codigo")
    @ManyToOne
    private ClasseToxica toxCodigo;
    @JoinColumn(name = "cod_classificacao", referencedColumnName = "cod_classificacao")
    @ManyToOne
    private Classificacao codClassificacao;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "codProduto")
    private Collection<Estoque> estoqueCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "codProduto")
    private Collection<MovimentacaoProduto> movimentacaoProdutoCollection;

    public Produto() {
    }

    public Produto(Integer codProduto) {
        this.codProduto = codProduto;
    }

    public Produto(Integer codProduto, String prodDescricao, String prodPrincativo) {
        this.codProduto = codProduto;
        this.prodDescricao = prodDescricao;
        this.prodPrincativo = prodPrincativo;
    }

    public Integer getCodProduto() {
        return codProduto;
    }

    public void setCodProduto(Integer codProduto) {
        this.codProduto = codProduto;
    }

    public String getProdDescricao() {
        return prodDescricao;
    }

    public void setProdDescricao(String prodDescricao) {
        this.prodDescricao = prodDescricao;
    }

    public String getProdPrincativo() {
        return prodPrincativo;
    }

    public void setProdPrincativo(String prodPrincativo) {
        this.prodPrincativo = prodPrincativo;
    }

    public String getProdCultura() {
        return prodCultura;
    }

    public void setProdCultura(String prodCultura) {
        this.prodCultura = prodCultura;
    }

    public String getProdFabricante() {
        return prodFabricante;
    }

    public void setProdFabricante(String prodFabricante) {
        this.prodFabricante = prodFabricante;
    }

    public Collection<ProdutoFornecedor> getProdutoFornecedorCollection() {
        return produtoFornecedorCollection;
    }

    public void setProdutoFornecedorCollection(Collection<ProdutoFornecedor> produtoFornecedorCollection) {
        this.produtoFornecedorCollection = produtoFornecedorCollection;
    }

    public ClasseToxica getToxCodigo() {
        return toxCodigo;
    }

    public void setToxCodigo(ClasseToxica toxCodigo) {
        this.toxCodigo = toxCodigo;
    }

    public Classificacao getCodClassificacao() {
        return codClassificacao;
    }

    public void setCodClassificacao(Classificacao codClassificacao) {
        this.codClassificacao = codClassificacao;
    }

    public Collection<Estoque> getEstoqueCollection() {
        return estoqueCollection;
    }

    public void setEstoqueCollection(Collection<Estoque> estoqueCollection) {
        this.estoqueCollection = estoqueCollection;
    }

    public Collection<MovimentacaoProduto> getMovimentacaoProdutoCollection() {
        return movimentacaoProdutoCollection;
    }

    public void setMovimentacaoProdutoCollection(Collection<MovimentacaoProduto> movimentacaoProdutoCollection) {
        this.movimentacaoProdutoCollection = movimentacaoProdutoCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codProduto != null ? codProduto.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Produto)) {
            return false;
        }
        Produto other = (Produto) object;
        if ((this.codProduto == null && other.codProduto != null) || (this.codProduto != null && !this.codProduto.equals(other.codProduto))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Bean.Produto[codProduto=" + codProduto + "]";
    }

}

Entidade Fornecedor

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

package Bean;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 *
 * @author Josimar
 */
@Entity
@Table(name = "fornecedor")
@NamedQueries({@NamedQuery(name = "Fornecedor.findByCodFornecedor", query = "SELECT f FROM Fornecedor f WHERE f.codFornecedor = :codFornecedor"), @NamedQuery(name = "Fornecedor.findByFrnRazaosocial", query = "SELECT f FROM Fornecedor f WHERE f.frnRazaosocial = :frnRazaosocial"), @NamedQuery(name = "Fornecedor.findByFrnCnpj", query = "SELECT f FROM Fornecedor f WHERE f.frnCnpj = :frnCnpj"), @NamedQuery(name = "Fornecedor.findByFrnInscrestadual", query = "SELECT f FROM Fornecedor f WHERE f.frnInscrestadual = :frnInscrestadual"), @NamedQuery(name = "Fornecedor.findByFrnEmail", query = "SELECT f FROM Fornecedor f WHERE f.frnEmail = :frnEmail"), @NamedQuery(name = "Fornecedor.findByFrnTelefone", query = "SELECT f FROM Fornecedor f WHERE f.frnTelefone = :frnTelefone"), @NamedQuery(name = "Fornecedor.findByFrnNumero", query = "SELECT f FROM Fornecedor f WHERE f.frnNumero = :frnNumero"), @NamedQuery(name = "Fornecedor.findByFrnComplemento", query = "SELECT f FROM Fornecedor f WHERE f.frnComplemento = :frnComplemento")})
public class Fornecedor implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "cod_fornecedor", nullable = false)
//    Annotation necessaria para campos auto increment quando utilizado hibernate
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer codFornecedor;
    @Column(name = "frn_razaosocial", nullable = false)
    private String frnRazaosocial;
    @Column(name = "frn_cnpj", nullable = false)
    private String frnCnpj;
    @Column(name = "frn_inscrestadual", nullable = false)
    private String frnInscrestadual;
    @Column(name = "frn_email")
    private String frnEmail;
    @Column(name = "frn_telefone")
    private String frnTelefone;
    @Column(name = "frn_numero")
    private String frnNumero;
    @Column(name = "frn_complemento")
    private String frnComplemento;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "codFornecedor")
    private Collection<ProdutoFornecedor> produtoFornecedorCollection;
    @JoinColumn(name = "log_codigo", referencedColumnName = "log_codigo")
    @ManyToOne
    private Logradouro logCodigo;
    @OneToMany(mappedBy = "codFornecedor")
    private Collection<Movimentacao> movimentacaoCollection;

    public Fornecedor() {
    }

    public Fornecedor(Integer codFornecedor) {
        this.codFornecedor = codFornecedor;
    }

    public Fornecedor(Integer codFornecedor, String frnRazaosocial, String frnCnpj, String frnInscrestadual) {
        this.codFornecedor = codFornecedor;
        this.frnRazaosocial = frnRazaosocial;
        this.frnCnpj = frnCnpj;
        this.frnInscrestadual = frnInscrestadual;
    }

    public Integer getCodFornecedor() {
        return codFornecedor;
    }

    public void setCodFornecedor(Integer codFornecedor) {
        this.codFornecedor = codFornecedor;
    }

    public String getFrnRazaosocial() {
        return frnRazaosocial;
    }

    public void setFrnRazaosocial(String frnRazaosocial) {
        this.frnRazaosocial = frnRazaosocial;
    }

    public String getFrnCnpj() {
        return frnCnpj;
    }

    public void setFrnCnpj(String frnCnpj) {
        this.frnCnpj = frnCnpj;
    }

    public String getFrnInscrestadual() {
        return frnInscrestadual;
    }

    public void setFrnInscrestadual(String frnInscrestadual) {
        this.frnInscrestadual = frnInscrestadual;
    }

    public String getFrnEmail() {
        return frnEmail;
    }

    public void setFrnEmail(String frnEmail) {
        this.frnEmail = frnEmail;
    }

    public String getFrnTelefone() {
        return frnTelefone;
    }

    public void setFrnTelefone(String frnTelefone) {
        this.frnTelefone = frnTelefone;
    }

    public String getFrnNumero() {
        return frnNumero;
    }

    public void setFrnNumero(String frnNumero) {
        this.frnNumero = frnNumero;
    }

    public String getFrnComplemento() {
        return frnComplemento;
    }

    public void setFrnComplemento(String frnComplemento) {
        this.frnComplemento = frnComplemento;
    }

    public Collection<ProdutoFornecedor> getProdutoFornecedorCollection() {
        return produtoFornecedorCollection;
    }

    public void setProdutoFornecedorCollection(Collection<ProdutoFornecedor> produtoFornecedorCollection) {
        this.produtoFornecedorCollection = produtoFornecedorCollection;
    }

    public Logradouro getLogCodigo() {
        return logCodigo;
    }

    public void setLogCodigo(Logradouro logCodigo) {
        this.logCodigo = logCodigo;
    }

    public Collection<Movimentacao> getMovimentacaoCollection() {
        return movimentacaoCollection;
    }

    public void setMovimentacaoCollection(Collection<Movimentacao> movimentacaoCollection) {
        this.movimentacaoCollection = movimentacaoCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codFornecedor != null ? codFornecedor.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Fornecedor)) {
            return false;
        }
        Fornecedor other = (Fornecedor) object;
        if ((this.codFornecedor == null && other.codFornecedor != null) || (this.codFornecedor != null && !this.codFornecedor.equals(other.codFornecedor))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Bean.Fornecedor[codFornecedor=" + codFornecedor + "]";
    }

}

Entidade ProdutoFornecedor

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

package Bean;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
 *
 * @author Josimar
 */
@Entity
@Table(name = "produto_fornecedor")
@NamedQueries({@NamedQuery(name = "ProdutoFornecedor.findByCodProdutoFornecedor", query = "SELECT p FROM ProdutoFornecedor p WHERE p.codProdutoFornecedor = :codProdutoFornecedor")})
public class ProdutoFornecedor implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "cod_produto_fornecedor", nullable = false)
//    Annotation necessaria para campos auto increment quando utilizado hibernate
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer codProdutoFornecedor;
    @JoinColumn(name = "cod_produto", referencedColumnName = "cod_produto")
    @ManyToOne
    private Produto codProduto;
    @JoinColumn(name = "cod_fornecedor", referencedColumnName = "cod_fornecedor")
    @ManyToOne
    private Fornecedor codFornecedor;

    public ProdutoFornecedor() {
    }

    public ProdutoFornecedor(Integer codProdutoFornecedor) {
        this.codProdutoFornecedor = codProdutoFornecedor;
    }

    public Integer getCodProdutoFornecedor() {
        return codProdutoFornecedor;
    }

    public void setCodProdutoFornecedor(Integer codProdutoFornecedor) {
        this.codProdutoFornecedor = codProdutoFornecedor;
    }

    public Produto getCodProduto() {
        return codProduto;
    }

    public void setCodProduto(Produto codProduto) {
        this.codProduto = codProduto;
    }

    public Fornecedor getCodFornecedor() {
        return codFornecedor;
    }

    public void setCodFornecedor(Fornecedor codFornecedor) {
        this.codFornecedor = codFornecedor;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codProdutoFornecedor != null ? codProdutoFornecedor.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof ProdutoFornecedor)) {
            return false;
        }
        ProdutoFornecedor other = (ProdutoFornecedor) object;
        if ((this.codProdutoFornecedor == null && other.codProdutoFornecedor != null) || (this.codProdutoFornecedor != null && !this.codProdutoFornecedor.equals(other.codProdutoFornecedor))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Bean.ProdutoFornecedor[codProdutoFornecedor=" + codProdutoFornecedor + "]";
    }

}

Trecho do codigo onde eu tento fazer a Alteração.

    beanClassificacao = new Classificacao();
    beanClasseToxica = new ClasseToxica();
    beanFornecedor = new Fornecedor();
    Comum comum = new Comum();
    EntityManager manager = null;

    try {
        if (jtfProduto.getText().equals("") || jtfPrincipio.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Campos em negrito não podem ser vazios!", "Advertência", JOptionPane.WARNING_MESSAGE);
        } else {
            manager = Conexao.getConexao();

            beanClassificacao = manager.find(Classificacao.class, listaClassificacao.get(jcbClassificacao.getSelectedIndex()).getCodClassificacao());
            beanClasseToxica = manager.find(ClasseToxica.class, listaClasseToxica.get(jcbClasseToxica.getSelectedIndex()).getToxCodigo());
            beanFornecedor = manager.find(Fornecedor.class, listaFornecedor.get(jcbFornecedor.getSelectedIndex()).getCodFornecedor());
           
            beanProduto.setCodClassificacao(beanClassificacao);
            beanProduto.setToxCodigo(beanClasseToxica);
            beanProduto.setProdDescricao(jtfProduto.getText());
            beanProduto.setProdPrincativo(jtfPrincipio.getText());
            beanProduto.setProdCultura(jtfCultura.getText());
            beanProduto.setProdFabricante(jtfFabricante.getText());
            
            beanProdutoFornecedor.setCodProduto(beanProduto);
            beanProdutoFornecedor.setCodFornecedor(beanFornecedor);
            
            manager.getTransaction().begin();
            Conexao.Alterar(beanProduto, beanProdutoFornecedor);
            jbAlterar.setEnabled(false);
            jbExcluir.setEnabled(false);
            manager.getTransaction().commit();
            comum.clearComponent(this);
        }
    } catch (Exception ex) {
        manager.getTransaction().rollback();
        JOptionPane.showMessageDialog(null, ex);
        Logger.getLogger(FrmProduto.class.getName()).log(Level.SEVERE, null, ex);
    }

Metodo que faz a Alteração

 public static void Alterar(Object objeto1, Object objeto2) throws Exception {
        EntityManager manager = null;
        try {
            if (JOptionPane.showConfirmDialog(null, "Confirma Alteração ?", "Alerta !", JOptionPane.WARNING_MESSAGE) == 0) {
                manager = Conexao.getConexao();
                manager.getTransaction().begin();
                manager.merge(objeto1);
                manager.merge(objeto2);
                manager.getTransaction().commit();

            }
        } catch (Exception e) {
            manager.getTransaction().rollback();
            e.printStackTrace();
            throw new Exception("Erro ao Alterar" + e);
        }
    }

alguma dica ?