3
respostas

Problema na gravação de um objeto no parâmetro do Controller

Pessoal, estou com um problema para gravar objetos quando coloco como um parâmetro no controller. No meu caso eu coloquei uma lista de livros para o Cliente

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Livro> livros = new ArrayList<Livro>();

porém quando inclui um livro novo na lista dele conforme acontece o seguinte erro:

GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Error occurred while storing entity [br.com.casadocodigo.models.Livro@341a2cac]. An entity copy [br.com. casadocodigo.models.Livro#1] was already assigned to a different entity [br.com. casadocodigo.models.Livro#1].] with root cause
java.lang.IllegalStateException: Error occurred while storing entity [br.com. casadocodigo.models.Livro@341a2cac]. An entity copy [br.com. casadocodigo.models.Livro#1] was already assigned to a different entity [br.com. casadocodigo.models.Livro#1].
at org.hibernate.event.internal.EventCache.put(EventCache.java:192)

O código abaixo é o do controller. Pelo que entendi, ele está reclamando de utilizar o objeto do parâmetro do método na gravação. Não sei se tem a ver com a entidade do Hibernate. O fato é que o código abaixo não funciona.

@RequestMapping("/{id}/gravarLivro")
@ResponseBody
public Livro gravar(@PathVariable("id") Integer id, Livro livro) {

Cliente cliente = clienteDao.find(id);

cliente.getLivros().add(livro);

clienteDao.gravar(cliente);

return livro;
}

Porém, quando crio outro objeto e passo os atributos do objeto do parâmetro para o que criei no corpo do método, ele grava no banco de dados corretamente.

@RequestMapping(value = "/{id}/gravarLivro", method = RequestMethod.POST)
    @ResponseBody
    public Livro gravar(@PathVariable("id") Integer id, Livro livro) {

        Cliente cliente = clienteDao.find(id);

        Livro livro1= new Livro();

        livro1.setTitulo(livro.getTitulo());
        livro1.setDescricao(livro.getDescricao());
        livro1.setValor(livro.getValor());



        cliente.getLivros().add(livro1);

        clienteDao.gravar(cliente);



        return livro1;
    }

Gostaria de saber como melhorar esse código, visto que não está nada elegante a minha implementação.

Quando não tenho um relacionamento entre as classes (como o Produto no video do curso), consigo gravar diretamente sem problemas.

Obrigado

3 respostas

eu nunca vi esse erro.. parece que é um problema de cache interno do hibernate... vou tentar dar uma pesquisada e tento voltar com alguma sugestão.

ok. no aguardo. obrigado.

minha busca me levou ate aqui =>https://hibernate.atlassian.net/browse/HHH-9106

não cheguei a ler o motivo completo, mas tem a ver com o cascade. Então, do meu ponto de vista, vc tem duas opções: ler a discussão na jira do hibernate tirar o cascade e controlar os relacionamentos na mão(o que eu faria)