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

Relacionamento.

Opa, estou com uma dúvida sobre esta aula. Estou com essa classe testando o insert de produto. Acontece o mesmo problema que foi mostrado no vídeo sobre o produto estar detached. Estou usando classes separadas para persistir os objetos... Tem um caminho melhor pra não ocorrer isso?

public class TesteInsertProduto {
    public static void main(String[] args) {        

        BalancaDAO balancaDAO = new BalancaDAO();
        EmbalagemDAO embalagemDAO = new EmbalagemDAO();
        ProdutoDAO produtoDAO = new ProdutoDAO();

        Produto produto = new Produto();
        Embalagem embalagem1 = new Embalagem();
        Embalagem embalagem2 = new Embalagem();
        Balanca balanca1 = new Balanca();
        Balanca balanca2 = new Balanca();            

        produto.setDescricaoProduto("Manchuria Verde");
        produto.setNomeProduto("Oriente Silvestre");
        produto.setRegistroProduto("BR123456752");

        balanca1.setDescricaoPeso("300G");
        balanca1.setPesoNominal(200.00);
        balanca1.setPesoReal(220.00);
        balanca1.setProduto(produto);

        balancaDAO.persist(balanca1);

        balanca2.setDescricaoPeso("150G");
        balanca2.setPesoNominal(150.00);
        balanca2.setPesoReal(170.00);
        balanca2.setProduto(produto);    

        balancaDAO.persist(balanca2);

        embalagem1.setId((long) 1);
        embalagem1.setDescComposicao("Acido Manxúrico PHO2-N2-OH-");
        embalagem1.setDescRegistro("INPEV-V20");
        embalagem1.setDescricaoEmbalagem("Embalagem de Alumínio");
        embalagem1.setGTIN("123456789101");
        embalagem1.setPesoReferencia("300G");    

        embalagemDAO.persist(embalagem1);

        embalagem2.setId((long) 2);
        embalagem2.setDescComposicao("Acido Manxúrico PHO2-N2-OH-");
        embalagem2.setDescRegistro("INPEV-V20");
        embalagem2.setDescricaoEmbalagem("Embalagem de Alumínio");
        embalagem2.setGTIN("123456789101");
        embalagem2.setPesoReferencia("150G");

        embalagemDAO.persist(embalagem2);

        List<Balanca> pesagens = new ArrayList<Balanca>();
        pesagens.add(balanca1);
        pesagens.add(balanca2);        

        List<Embalagem> embalagens = new ArrayList<Embalagem>();
        embalagens.add(embalagem1);
        embalagens.add(embalagem2);    

        produto.setBalanca(pesagens);            
        produto.setEmbalagem(embalagens);    

        produtoDAO.persist(produto);

        System.out.println("Voce persistiu os objetos: "+
                            balanca1.toString() +
                            balanca2.toString() +
                            embalagem1.toString()+
                            embalagem2.toString()+
                            produto.toString());        
    }

O produto insere, a balança insere mas quando vou inserir a segunda balança dá o erro de detached em produto:


detached entity passed to persist: br.com.jayres.previsao.model.Produto

As anotações na classe produto são:


@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="produto_id")
    private Long id;
    private String nomeProduto;
    private String descricaoProduto;
    private String registroProduto;

    @OneToMany(targetEntity=br.com.jayres.previsao.model.Embalagem.class, orphanRemoval=true)    
    private List<Embalagem> embalagem;

    @OneToMany(targetEntity=br.com.jayres.previsao.model.Balanca.class, orphanRemoval=true) 
    private List<Balanca> balanca

Valeu!

2 respostas

Crio um DAO específico para o processo de associação? tipo: PesagemProdutoDAO e EmbalagensProdutoDAO ? Alguém?

solução!

Beleza, acho que entendi...

public class TesteCriaProduto {
    public static void main(String[] args) {        

            ProdutoDAO produtoDAO = new ProdutoDAO();    
            EmbalagemDAO embalagemDAO = new EmbalagemDAO();

            Embalagem embalagem = new Embalagem();
            embalagem.setDescComposicao("N-P-K");
            embalagem.setDescRegistro("BR191919");
            embalagem.setDescricaoEmbalagem("100G");
            embalagem.setGTIN("456789123456");
            embalagem.setPesoReferencia("100G");        
            embalagemDAO.persist(embalagem);

            Embalagem embalagem2 = new Embalagem();
            embalagem2.setDescComposicao("M-P-K");
            embalagem2.setDescRegistro("US191919");
            embalagem2.setDescricaoEmbalagem("100G");
            embalagem2.setGTIN("456789123456");
            embalagem2.setPesoReferencia("200G");
            embalagemDAO.persist(embalagem2);

            Embalagem embalagem3 = new Embalagem();
            embalagem3.setDescComposicao("O-P-K");
            embalagem3.setDescRegistro("CH191919");
            embalagem3.setDescricaoEmbalagem("100G");
            embalagem3.setGTIN("456789123456");
            embalagem3.setPesoReferencia("200G");
            embalagemDAO.persist(embalagem3);        

            List<Embalagem> embalagens = new ArrayList<Embalagem>();

            embalagens.add(embalagem);
            embalagens.add(embalagem2);
            embalagens.add(embalagem3);

            Produto produto1 = new Produto();        
            produto1.setDescricaoProduto("Manchuria Verde");
            produto1.setNomeProduto("Oriente Silvestre");
            produto1.setRegistroProduto("BR123456752");            
            produto1.setEmbalagem(embalagens);            
            produtoDAO.persist(produto1);                    

            System.out.println("Voce persistiu os objetos: "
                                + produto1.toString());        

    }
}

Entidade

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)    
    private Long id;
    private String nomeProduto;
    private String descricaoProduto;
    private String registroProduto;

    @OneToMany(targetEntity=br.com.jayres.previsao.model.Embalagem.class, orphanRemoval=true)
    @JoinTable(
            name="produto_embalagem",
            joinColumns = @JoinColumn( name="produto_id"),
            inverseJoinColumns = @JoinColumn( name="embalagem_id")
    )    
    private List<Embalagem> embalagem;

    @OneToMany(targetEntity=br.com.jayres.previsao.model.Balanca.class, orphanRemoval=true) 
    @JoinTable(
            name="produto_balanca",
            joinColumns = @JoinColumn( name="produto_id"),
            inverseJoinColumns = @JoinColumn( name="balanca_id")
    )

Command:

Objeto Produto Persistido
Voce persistiu os objetos: Id: 2
Nome Produto: Oriente Silvestre
Descrição Produto: Manchuria Verde
Registro Produto: BR123456752
Lista de Embalagens: [Id: 4
Descrição Composição: N-P-K
Descrição Registro: BR191919
Descrição Embalagem: 100G
Peso de Referência: 100G
GTIN: 456789123456
, Id: 5
Descrição Composição: M-P-K
Descrição Registro: US191919
Descrição Embalagem: 100G
Peso de Referência: 200G
GTIN: 456789123456
, Id: 6
Descrição Composição: O-P-K
Descrição Registro: CH191919
Descrição Embalagem: 100G
Peso de Referência: 200G
GTIN: 456789123456
]