Toplink duplicando registros ao salvar

4 respostas
P

Opa :smiley:

To numa briga feia aqui com o Toplink. Consegui resolver o problema dele não salvar nada e agora estou com o problema que ele está salvando 2x a mesma coisa.

Eu não faço a menor idéia do que pode ser e to procurando no google, mas está difícil. ALguém aqui já passou por esses problemas?

Eu não consigo ver a query que ele gerou pq meu OC4J parou de enviar logs pra mim…acho que deve ser algo por causa do log4j, se alguém souber como posso dar um System.out.println() na query, eu faço isso e posto aqui

Vou colar meu código:

CargaDAO ( Classe Principal )

private UnitOfWork unitOfWork = UnitOfWorkFactory.getInstance().getUnitOfWork("DS102");

	private TbCargaRemarcacao gerarCargaPojo(CargaRemarcacaoVO cargaRemarcacaoVO){
		TbCargaRemarcacao pojo = this.adicionarOfertas(cargaRemarcacaoVO);
		TbTpCargaRemarcacao  pojoTp = buscarTipoCarga(new Long(1));
		pojo.setCdTpCargaRemarcacao(pojoTp);
		pojo.setDtCarga(cargaRemarcacaoVO.getDtCarga());
		pojo.setDtEtiqueta(cargaRemarcacaoVO.getDtEtiqueta());
		pojo.setDtFaturamento(cargaRemarcacaoVO.getDtFaturamento());
		pojo.setDtFimVigencia(cargaRemarcacaoVO.getDtFimVigencia());
		pojo.setDtInicioVigencia(cargaRemarcacaoVO.getDtInicioVigencia());
		pojo = (TbCargaRemarcacao)unitOfWork.registerObject(pojo);
		return pojo;
	}
	
	
	private TbTpCargaRemarcacao buscarTipoCarga(Long cdTpCarga){
		TpCargaDAO dao = new TpCargaDAO();
		TbTpCargaRemarcacao pojo = null;
		TipoCargaRemarcacaoVO tipo = new TipoCargaRemarcacaoVO();
		tipo.setCdTpOferta(cdTpCarga);
		tipo.setNovoTipo(false);
		pojo = dao.getTpCargaRemarcacao(tipo.getCdTpOferta());
		return pojo;
	}

TpCargaDAO

private UnitOfWork unitOfWork = UnitOfWorkFactory.getInstance().getUnitOfWork("R102");
	public TbTpCargaRemarcacao getTpCargaRemarcacao(Long cdTpCargaRemarcacao){
		ReadObjectQuery query = new ReadObjectQuery();
		query.setReferenceClass(TbTpCargaRemarcacao.class);
		ExpressionBuilder builder = query.getExpressionBuilder();
		Expression expr = builder.get("cdTpCargaRemarcacao").equal(cdTpCargaRemarcacao);
		query.setSelectionCriteria(expr);
		return (TbTpCargaRemarcacao)unitOfWork.executeQuery(query);
	}

Obg

[]'s

4 Respostas

faelcavalcanti

cara, fazia tempo que eu não via alguém falando sobre UnitOfWork. Mas em se falando do mesmo, a única referência que existia no meu bookmark até então seria esta, antigona de Aug-2003, e lá existe o seguinte comentário a respeito do método que você está utilizando registerObject, retirado da página 19:

When working with new objects, remember the following rules:
? Only reachable or registered objects will be persisted.
? New objects or objects that have been registered with registerNewObject are considered to be working copies in the Unit of Work.
? If you do a registerObject with a new object as the argument, then the result is the clone and the argument to registerObject is considered the cache version.

um pouco mais adiante, você achará uma seção chamada common erros, onde contêm:

acho que se você trocar por registerNewObject resolve. o que achei estranho foi pelo fato de não ter lançado exceção, isso não aconteceu ?

se tiver mais dificuldade, na documentação tem muitas notas e recomendações sobre o uso em:
http://download.oracle.com/docs/cd/B32110_01/web.1013/b28218/uowadv.htm#CACJEJGJ

editado: adicionei link do guia: Oracle Application Server TopLink Unit of Work Primer, acima! :^)

P

então, eu nunca tinha mexido com UnitOfWork…eu só conhecia o PersistentManager ( e na minha opinião, é muito melhor )…isso aqui já começou totalmente torto pq é complicado vc ter q usar framework de cliente e coisas q não tem um javadoc decente :S

o estranho é que ele não lança exceção e tb não está imprimindo minhas queries no prompt do OC4J ( isso é a pior coisa pq não sei o q ele roda )

com o registerNewObject, acontece a mesma coisa…ele grava 2x o registro assim como o registerObject…eu já havia tentado ele…

eu queria mto conseguir colocar o log nele hehe

o problema está nesse relacionamento pq se eu criar 2 objetos iguais, ele salva uma instância de cada, mas qdo eu tento salvar buscando um objeto no banco, ele salva 2 vezes o novo objeto ><

faelcavalcanti

está parecendo ser de relacionamento, mas não lembro agora o que poderia estar ocasionando. me passa o mapeamento deste bean, bem como este UnitOfWork está configurado!

P

Opa :smiley:

Consegui resolver esse problema de salvar 2x, eu estava usando o método registerObject() 2 vezes :oops:

Agora estou com outros 2 problemas:

  • Um DAO meu não salva. Ele diz que executa tudo e não salva.

  • O DAO que salvava 2x, agora ele só salva depois da 2ª chamada que eu fizer pra ele salvar haha

Eu to começando a desconfiar que seja problema do meu descriptor da classe. O problema é que eu to perdido. Eu tenho uma pasta com o nome de descriptor que tem uma cacetada de .xml de cada classe e tenho um outro xml chamado toplink-deployments.xml ( esse é chamado no sessions.xml ) e lá tem um mapeamento parecido com os dos xml. Não sei o que fazer. É necessário ter esses 2 xml’s?

[]'s

Criado 8 de novembro de 2008
Ultima resposta 12 de nov. de 2008
Respostas 4
Participantes 2