[RESOLVIDO] - Persistir e Atualizar vários objetos não relacionados na mesma transação

3 respostas
O

Srs.

A tempos tenho esta dúvida e não dediquei-me em buscar solução. Atualmente estou desenvolvendo um ERP para empresas de terceirização de serviços, neste projeto faço uso de: JSE - SWING, JPA - Eclipselink, JasperReport - iREport, Postgresql - JDBC. Em algumas situações tenho que persistir e atualizar diferentes classes “ao mesmo tempo” e como existe dependência de consistência, as atualizações só podem ocorrer se as persistências forem efetuadas com êxito.
Bem o que desejo é se possível juntar tanto os persist como os merge em uma mesma transação, simplesmente para fazer uso do roll’sback em caso de problemas, assim evitaria uma complexidade de código sendo feito manualmente para garantir que não exista inconsistência de dados se algum erro ocorrer durante a execução destas transações e deixar isto a cargo da implementação da JPA, ou seja o rollsback.

Abraços,

Olavo Jr.

3 Respostas

asandrob

Eu faço assim:

daoFactory.iniciarTransacao();
while (sldIt.hasNext()) {
  //muitos inserts e controlo as exceptions
}
daoFactory.encerrar();

Uso Hibernate.

lele_vader

O seu sistema é desktop não é ?
Se fosse web poderia usar EJB para controlar a transação.
O que você pode fazer é somente dar o commit na última transação, e fechar a session tbm.

O

Prezados,

Enquanto eu escrevia esta thread, fui iluminado por Deus e me veio uma idéia a qual implementei e resolveu o meu problema, logo após li as respostas de: lele_vader e asandrob, os quais agradeço a colaboração, que me indiciou estar no caminho certo. Segue abaixo a solução:

/**
     * 06/07/2012 - Método usado nos casos em que é necessário garantir a atomicidade
     * havendo transações de atualização e persistência envolvidos.
     * @param hmObjetos HashMap que contém o parâmetro e a classe.
     * @param Integer indica se o objeto deverá ser atualizado(número ímpar) ou persistido(número par).
     * @param Object recebe a classe que deverá ser atualizada ou persistida.
     * @return retorna o resultado da transação: sucesso(true) ou erro(false).
     */
    public Boolean getAtualizaPersisteObjetos(HashMap<Integer, Object> hmObjetos){
    	em.clear();
    	em.getTransaction().begin();
    
    	try 
    	{
    		// Identifica se o objeto deve ser atualizado ou persistido.
    		for (Integer atualiza : hmObjetos.keySet()) {
    			// Indica atualização.
				if ((atualiza % 2) != 0)
					em.merge(hmObjetos.get(atualiza));
				// Persiste.
				else
					em.persist(hmObjetos.get(atualiza));
			}
    	
    		em.getTransaction().commit();
    		return true;

    	} catch (Exception e){
    		e.printStackTrace();
    		em.getTransaction().rollback();
    		return false;
    	} 
    }// getAtualizaPersisteObjetos.

Abraços,

Olavo Jr.

Criado 6 de julho de 2012
Ultima resposta 9 de jul. de 2012
Respostas 3
Participantes 3