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