> 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.