Problema com o cascade, inserindo sem necessidade (Resolvido)

6 respostas
fallante

Galera, novamente estou aqui, depois de algum tempo.

Desta vez tenho duas entidades:

Produto que possui
public class Produto implements Serializable{

    @Id
    @Basic(optional = false)
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "produto_id_seq")
    private int id;

    @ManyToOne(cascade = CascadeType.ALL)
    //@JoinColumn( name = "unidade_codigo", referencedColumnName = "codigo_unidade")
    @JoinColumn( name = "unidade_codigo")
    private Unidade unidade;

    /*Metodos get e sets...*/
}
Unidade
public class Unidade implements Serializable{

    @Id
    @Basic(optional = false)
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "unidade_id_seq")
    private int id;

    @OneToMany(mappedBy="unidade", cascade = CascadeType.ALL)
    private List<Produto> produtos;
   /*Metodos get e sets...*/
}

Um produto possui apenas uma unidade.
Uma unidade possui varios produtos.

Exemplo:
Unidade = Litros
Produtos = Cervejas, Sucos, Refrigerantes e etc....

O problema

Quando eu adiciono uma unidade tudo certo.
Quanto eu adiciono um produto e seto a unidade ele tenta inserir novamente,

Tentativas

Ja tentei trocar o cascade e mudou o problema devido a isso acredito que o problema esteja ai,
se colocar CascadeType.ALL ele tenta inserir e da erro devido a chave primaria que nao coloquei no codigo
se coloco qualquer outro cascadeType... ele da o seguinte erro:

"During synchronization a new object was found through a relationship that was not marked cascade PERSIST"

Espero Respostas

6 Respostas

fabiocsilva

Como você seta a unidade? Se ela não for transiente em tese o cascade funcionaria sem problemas. Talvez você esteja tentando passar uma instância de unidade “desanexada” da contexto de persistência do jpa…

apferreira

Veja se funciona:
@ManyToOne(mappedBy = “unidade”)
ou
@ManyToOne(cascade = CascadeType.PERSIST)

fallante

fabiocsilva

meu main de teste esta assim:

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Unidade unid = new Unidade();
        unid.setCodigoUnidade("Li");
        unid.setDescricao("Litro");

        Produto prod = new Produto();
        prod.setDescricao("Refrigerante");
        prod.setQtde_base(2);
        prod.setQtde_pessoas_base(1);
        prod.setTipo("Bebida");
        prod.setUnidade(unid);

        boolean result = ProdutoDao.persist(prod);
    }

}

creio que o problema eh nos models mesmo.
Grato

fallante

apferreira

a primeira sugestao sua nao pode ser feita, pois mappedBy nao pode ser adicionado no @ManyToOne

a segunda nao funcionou, ele tentou inserir a Unidade, mas eu ja tenho a unidade no banco, entao da o erro de replicar uma chave.

Att.

fallante

Resolvido!!!!!!!!!!

no main eu deveria buscar o objeto e nao adicionar um igual.

resolucao:

public static void main(String[] args) {

        Unidade unid = new Unidade();
        unid.setCodigoUnidade("Li");
//        unid.setDescricao("Litro");

        Unidade teste = (Unidade) UnidadeDao.find(1);

        Produto prod = new Produto();
        prod.setDescricao("Refrigerante");
        prod.setQtde_base(2);
        prod.setQtde_pessoas_base(1);
        prod.setTipo("Bebida");
        prod.setUnidade(teste);

        boolean result = ProdutoDao.persist(prod);
    }
fabiocsilva
fallante:
Resolvido!!!!!!!!!!

no main eu deveria buscar o objeto e nao adicionar um igual.

resolucao:

public static void main(String[] args) {

        Unidade unid = new Unidade();
        unid.setCodigoUnidade("Li");
//        unid.setDescricao("Litro");

        Unidade teste = (Unidade) UnidadeDao.find(1);

        Produto prod = new Produto();
        prod.setDescricao("Refrigerante");
        prod.setQtde_base(2);
        prod.setQtde_pessoas_base(1);
        prod.setTipo("Bebida");
        prod.setUnidade(teste);

        boolean result = ProdutoDao.persist(prod);
    }

Exato, por isso perguntei como você estava setando a unidade. Você estava tentando salvar uma instância transiente, que o JPA entende como um novo registro. Como o "novo registro" já existia, ocorria um erro.

Criado 13 de junho de 2011
Ultima resposta 13 de jun. de 2011
Respostas 6
Participantes 3