[Resolvido] IllegalArgumentException

8 respostas
Alberto_Cerqueira

Bom Dia!!!

Caused by: java.lang.IllegalArgumentException: Removing a detached instance com.wave.erp.orm.cadastro.CanaisVenda#9

Alguém pode me ajudar???
Isto é erro de anotations ou com OO (DAO e Genereic, tallzz)

abraços galere =)

8 Respostas

Hebert_Coelho

É erro de não saber utilizar o JPA mesmo.

Você precisa fazer um find, merge, getReference ou qualquer outra coisa para localizar o objeto antes dele ser excluído.

Rodrigo_Sasaki

acho que isso aí é um erro do JPA,

você não pode dar um remove em uma entidade que não está sendo gerenciada, portanto é lançado esse erro.

Alberto_Cerqueira

ICanaisVendaBO

...
public void excluir(Long canaisVendaId) throws ObjectNotFoundException, UserException;
...

CanaisVendaBO

...
@Override
	public void excluir(Long canaisVendaId) throws UserException {
		try{
			@SuppressWarnings("unchecked")
			CanaisVenda canaisVenda = canaisVendaFinder.buscarCanaisVendaById(canaisVendaId);
			//excluirContatos(canaisVenda);
			canaisVendaDAO.excluir(canaisVenda);
		}catch(ObjectNotFoundException e){
			throw new UserException(e.getMessage());
		}
	}

@Transactional(propagation=Propagation.MANDATORY)
	protected void excluirContatos(CanaisVenda orm) {
		try{
			CanaisVenda oldCanaisVenda = getCanaisVendaFinder().buscarCanaisVendaById(orm.getId());
			Collection<CanaisVendaContato> oldCanaisVendasContatos = oldCanaisVenda.getContato();
			if (oldCanaisVendasContatos != null && !oldCanaisVendasContatos.isEmpty()){
				for(CanaisVendaContato oldCanaisVendaContato : oldCanaisVendasContatos){
					getCanaisVendaDAO().excluir(oldCanaisVendaContato);
				}
			}
		}catch(ObjectNotFoundException e){
			throw new UserException(e);
		}
	}
...

CanaisVendaDAO

...
@Override
	public void excluir(CanaisVenda contato) {
		super.excluir(contato);
	}
...

ICanaisVendaDAO

...
void excluir(CanaisVenda orm);
...

ManterCanaisVenda

...
public JSONReturn excluir(ServletRequest request , ServletResponse response) {
		Long canaisVendaId = Long.valueOf(request.getParameter("canaisVendaId"));
		try {
			canaisVendaBO.excluir(canaisVendaId);
		} catch(DataIntegrityViolationException e) { //TODO: Verificar se realmente vai fazer delecao fisica ou apenas logica
			String message = GerenciadorMensagem.getMessage("view.mantercanaisvenda.erro.integridade");
			return JSONReturn.newInstance(Consequence.ERRO).message(message);
		} catch (UserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ObjectNotFoundException e) {
			String messageUser = GerenciadorMensagem.getMessage("view.mantercanaisvenda.deletado.por.outro.usuario");
			return JSONReturn.newInstance(Consequence.ERRO).message(messageUser);
		}
		PaginationHttpSessionStored.setPagination(request,com.wave.erp.cadastro.controller.CacheadorSessao.CACHE_CANAIS_VENDA_PAGINATION, null);
		return JSONReturn.newInstance(Consequence.SUCESSO).messageKey("view.exclusao.feita.com.sucesso");
	}
...

jakefrog assim vc fala???

Rodrigo_Sasaki

E o método que busca a entidade? poste ele também.

Alberto_Cerqueira

CanalVendaFinder.java

...
@Override
	@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
	public CanaisVenda buscarCanaisVendaById(Long canaisVendaId, IFetchEager<CanaisVenda>... eagers) throws ObjectNotFoundException {
		CanaisVenda canaisVenda = em.find(CanaisVenda.class, canaisVendaId);
		if (canaisVenda == null){
			String mensagem = GerenciadorMensagem.getMessage("canaisvenda.finder.canaisvenda.nao.encontrada");
			throw new ObjectNotFoundException(CanaisVendaFinder.class, mensagem);
		}else{
			FetchEagerUtils.runFetch(canaisVenda, eagers);
		}
		return canaisVenda;	
	}
..
Hebert_Coelho

Aqui Aplicação Web Completa JSF EJB JPA JAAS
ou aqui Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate

você encontra o modo correto de fazer.

Vá na página em que mostra o DAO. Lá tem o exemplo correto.

Rodrigo_Sasaki

Bom, analisando seu código, eu acredito que o problema está na chamada:FetchEagerUtils.runFetch(canaisVenda, eagers); Algo aí deve fazer esse objeto se tornar detached ao persistence context.

Mas você não precisa dessa chamada para excluir o objeto, talvez seja melhor analisar melhor sua busca.

Alberto_Cerqueira

digaoneves

Consegui mano.

A classe BO no metodo excluir estava sem
@Transactional(propagation=Propagation.REQUIRED)

vlw mano.

obg

Criado 22 de agosto de 2012
Ultima resposta 22 de ago. de 2012
Respostas 8
Participantes 3