:Nested transaction not supported

1 resposta
kleins

Pessoal.

Estou recebendo o seguinte erro quando tento persistir um objeto já existente no banco…

Eu tenho uma Exception que trata isso, mas ele dá o erro “:Nested transaction not supported.”

Alguém já passou por isso ?

[]´s

Rodrigo

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.org.system4.DAO;

import br.org.system4.entity.Partner;
import java.math.BigDecimal;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.transaction.UserTransaction;

/**
 *
 * @author rodrigo.klein
 */
public class PartnerDAOjpa implements PartnerDAO{

private void persist(Object object) {
       
        
    
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
            em.persist(object);
            utx.commit();
           
            
        } catch (EntityExistsException ex){
            
            
                            try {
                                        System.out.println("Update :");
                                        Context ctx2 = new InitialContext();
                                        UserTransaction utx2 = (UserTransaction) ctx2.lookup("java:comp/env/UserTransaction");
                                        utx2.begin();
                                        EntityManager em2 = (EntityManager) ctx2.lookup("java:comp/env/persistence/LogicalName");
                                        em2.merge(object);
                                        utx2.commit();
                                    } catch (Exception exz) {
                                        System.out.println("Error ::" + exz.getMessage());
                                    }
            
            
            
            
        } catch (Exception e) {
            
                            System.out.println("Error ::" + e.getMessage());        
            
            
        }
    }

    public void save(Partner partner) {
         persist(partner);
    }

    public void delete(Partner partner) {
        
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
            em.remove(partner);
            utx.commit();
        } catch (Exception e) {
            System.out.println("Error :"+e.getMessage());
            
        }
        
    }

    public List getAllPartners() {
        
        List partnerList = null;
        
        try {
            // SELECT i FROM Ium i
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
            partnerList = em.createQuery("SELECT p from Partner p").getResultList();
            utx.commit();
        } catch (Exception exception) {
        }

        
        
        return partnerList;
        
    }

    public Partner getPartnerbyId(BigDecimal id) {
        Partner partner = null;
        
            try {
                    Context ctx = new InitialContext();
                    EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
                    partner = em.find(Partner.class, id);
                    
                 } catch (Exception e) {

                    System.out.print(e.getMessage());

            }

 
  return partner;  
    }
    
public Partner getPartnerByCnpj(String cnpj){
    
        Partner partner = null;
        
            try {
                    //BigDecimal bgid = BigDecimal.valueOf(Double.valueOf(String.valueOf(id)));
                    Context ctx = new InitialContext();
                    EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
                    partner = (Partner) em.createNamedQuery("Partner.findByCnpj").setParameter("cnpj", cnpj).getSingleResult();

            } catch (Exception e) {
                    System.out.print(e.getMessage());
            }
  return partner;  
}      
    
public Partner getPartnerByNome(String nome){
    
        Partner partner = null;
        
            try {
                    //BigDecimal bgid = BigDecimal.valueOf(Double.valueOf(String.valueOf(id)));
                    Context ctx = new InitialContext();
                    EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
                    partner = (Partner) em.createNamedQuery("Partner.findByNome").setParameter("nome", nome).getSingleResult();

                    
            } catch (Exception e) {
                    System.out.print(e.getMessage());
            }
  return partner;  
}      
public Partner getPartnerByRazao(String razao){
    
        Partner partner = null;
        
            try {
                    //BigDecimal bgid = BigDecimal.valueOf(Double.valueOf(String.valueOf(id)));
                    Context ctx = new InitialContext();
                    EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
                    partner = (Partner) em.createNamedQuery("Partner.findByRazao").setParameter("razao", razao).getSingleResult();

            } catch (Exception e) {
                    System.out.print(e.getMessage());
            }
  return partner;  
}      


}

1 Resposta

R

Olhando rapidamente percebo o seguinte:
No try vc abre uma transação, e se der erro, vc cai no catch, onde vc abre outra transação.
Isso vai dar em Nested Transaction, que não é suportada em Java EE.

Tenta fazer o seguinte:

Abre a transação só começo do try.

Pega o EntityManager e usa o método joinTransaction - esse método faz o EM entrar na transação em andamento.

E dá para saber se já tem um transação em andamento: no objeto UserTransaction tem o método getStatus(), que te dá um inteiro, para ser comparado contra as constantes de javax.transaction.Status

Criado 7 de julho de 2008
Ultima resposta 7 de jul. de 2008
Respostas 1
Participantes 2