[RESOLVIDO] [JPA] detached entity / unsaved transient instance

2 respostas
walacy

> detached entity passed to persist / object references an unsaved transient instance

Pessoal, depois de um bom tempo longe do fórum, estou de volta com um probleminha chato… Agradeço a ajuda. Segue:

Tenho um método que insere um Lista de UsuarioContrato (ManyToOne de Usuario e Contrato). Ao realizar a inserção, eu verifico se o Usuario já está cadastrado (findEntityID), se já estiver, preencho o objeto em UsuarioContrato e persisto, conforme abaixo.

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = AplicacaoGenericaException.class)
public void insertAll(Collection<UsuarioContrato> list) throws AplicacaoGenericaException {
	for (UsuarioContrato uc : list) {
		Usuario u = this.usuarioService.findEntityID(new UsuarioFilter(uc.getUsuario()));
		if (u != null) {
			uc.getUsuario().setId(u.getId());
		}
		this.insert(uc);
	}
}

O problema é que estou tentando cadastrar 2 vezes o mesmo usuário para Contrato’s diferentes. Ao cadastrar o segundo, ocorre “detached entity passed to persist”.

Tentei modificar para recuperar o objeto Usuario completo (findEntity), no entanto, o erro muda e passa a ocorrer "object references an unsaved transient instance - save the transient instance before flushing", porque o objeto foi criado na primeira iteração…

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = AplicacaoGenericaException.class)
public void insertAll(Collection<UsuarioContrato> list) throws AplicacaoGenericaException {
	for (UsuarioContrato uc : list) {
		Usuario u = this.usuarioService.findEntity(new UsuarioFilter(uc.getUsuario()));
		if (u != null) {
			uc.setUsuario(u);
		}
		this.insert(uc);
	}
}

Alguém tem alguma idéia de como resolver isso?

PS: Os métodos findEntity e insert são chamadas diretas ao EntityManager.

2 Respostas

Hebert_Coelho

Aqui explica o problema e como resolver: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

walacy

Excelente o seu blog, porém descobri que faltava um registro no banco que obviamente causaria “unsaved transient instance”.

Moderação, favor apagar o tópico ou apenas fechá-lo para que outros vejam o link do blog do Hebert.

Criado 24 de outubro de 2012
Ultima resposta 24 de out. de 2012
Respostas 2
Participantes 2