[RESOLVIDO] Dando rollback() no JPA

6 respostas
A
Está gerando a:
java.lang.IllegalStateException: Transaction not active
Problema aqui:
em.getTransaction().rollback();  //não deveria desfazer o objeto deletado aqui?!?!?!?!?!?
//método de deleção de JPA Utilities
  public void removerPorChave(Class objeto, Integer chave) {
        EntityManager em = getEntityManager();
        
        try {
        	Object x = getEntity(objeto, chave);
        	Object y = em.merge(x);
            em.remove(y);
            em.flush();
            em.getTransaction().commit();
            em.flush();
        } catch (RuntimeException e) {
            em.getTransaction().rollback(); //não deveria desfazer o objeto deletado aqui?!?!?!?!?!?
            throw e;
        } finally {
            em.close();
        }
    }
//método dao  
public void removeImagem(int idDaImagem){
		  JPAUtil.getInstance().removerPorChave(PessoaImagem.class, idDaImagem);
		  JPAUtil.getInstance().flush();
     }

6 Respostas

lucas_carvalho100

Por que você não usa assim?

public void removerPorChave(Class objeto, Integer chave) {  
        EntityManager em = getEntityManager();  
		EntityTransaction etx = em.getTransaction();
          
        try {  
		     etx.begin();  
            Object x = getEntity(objeto, chave);  
            Object y = em.merge(x);  
            em.remove(y);              
            etx.commit;
			
        } catch (RuntimeException e) {  
            etx.rollback(); //não deveria desfazer o objeto deletado aqui?!?!?!?!?!?  
            throw e;  
        } finally {  
            em.close();  
        }  
    }
A

Lucas, perfect!
Funcionou com o código que vc postou…

Valeu,

A

Dúvida:

Se não der begin() no EntityTransaction nunca funcionará o rollback()?

lucas_carvalho100

Você deve iniciar a transação sempre que for fazer update,delete e insert, agora select não é necessário transação…

Sempre use transação.

A

100% entendido. Valeu.

M

Olá,

Estou com um problema que é quando ao deletar, no commit ocorre uma exceção (pelo registro ser uma chave estrangeira por
exemplo). Quando isto ocorre, ok, eu trato a exceção. Porém sempre que eu usar um “find” do JPA com um id se
tentou excluir, ele retorna null, sendo que no BD o registro existe, já que a transação (commit) tinha falhado.

Parece que ele busca de um cache.

Por favor, alguém sabe como resolver isto?

Criado 3 de janeiro de 2011
Ultima resposta 23 de jan. de 2012
Respostas 6
Participantes 3