[RESOLVIDO] Dando rollback() no JPA

Está gerando a: java.lang.IllegalStateException: Transaction not active

Problema aqui: em.getTransaction().rollback(); //não deveria desfazer o objeto deletado aqui?!?!?!?!?!?

[code]

//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();
    }
}[/code]



 [code] 

//método dao
public void removeImagem(int idDaImagem){
JPAUtil.getInstance().removerPorChave(PessoaImagem.class, idDaImagem);
JPAUtil.getInstance().flush();
}[/code]

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();  
        }  
    }  

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

Valeu,

Dúvida:

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

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.

100% entendido. Valeu.

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?