JPA...erro EntityManager is closed quando inseri varios registros

2 respostas
P

no uso do metodo Close() que contém

public void Close() {
		manager.close();
		factory.close();
	}

mas quando uso em um for que quero incluir varios registros ao mesmo tempo me dá erro

for (int w=1;w<3;w++){

    dao = new UserDao();
    user = new User();
    user.setName("New Company "+w);      
    dao.persist(company); 



}

o primeiro inclui mas o segundo da o erro abaixo ::::::

 java.lang.IllegalStateException: EntityManager is closed

o meu DAO extends AbstractBaseDao e não estou usando Spring …

public class DATAS {
    
    protected String bDatabase = "banco";	

    protected EntityManagerFactory factory     = Persistence.createEntityManagerFactory(bDatabase);
    protected EntityManager        manager     = factory.createEntityManager();
    private   EntityTransaction    transaction = null;

    private static DATAS instance = new DATAS();   

    private DATAS(){
    }
    
    public static DATAS getInstance() {   
    	return instance;   
    }   

    public EntityManager getManager() {
    	return this.manager;
    }
    
    public void BeginTransaction()
    {
    	transaction = manager.getTransaction();
    	transaction.begin();
    }
    
    public void CommitTransaction()
    {
    	transaction.commit();
    }

	public void RollBackTransaction() {
		transaction.rollback();
	}    
	
	public void Close() {
		manager.close();
		factory.close();
	}    
}

------
public abstract class AbstractBaseDao<T extends Entity, ID extends Serializable> extends JpaDaoSupport implements BaseDao<T, ID> {
	
	
	protected DATAS mDATAS = null;

	public AbstractBaseDao() {
		
		mDATAS = DATAS.getInstance();

	}

	/* Classe que representa o objeto de domínio gerenciado pelo DAO. */
    protected Class<T> domainClass = getDomainClass();

    /* Retorna a classe do objeto de domínio gerenciado pelo DAO. */
    @SuppressWarnings("unchecked")
	protected Class<T> getDomainClass() {
        if (domainClass == null) {
        	ParameterizedType thisType = (ParameterizedType) getClass().getGenericSuperclass();
            domainClass = (Class<T>) thisType.getActualTypeArguments()[0];
        }
        return domainClass;
    }

    
	/**
	 * @see BaseDao#persist(ID) BaseDao.persist(T t)
	 */
    public void persist(T t) throws DaoException {
    	try {
    		
    		
    		mDATAS.BeginTransaction();
    		mDATAS.getManager().persist(t);
    		mDATAS.getManager().flush();
    		mDATAS.CommitTransaction();
    	} catch(Exception e) {
    		throw new DaoException(getErrorCode(METHOD_PERSIST), "Can not insert", e);
    	}finally{
    		mDATAS.Close();
    	}
    }
	

	

}

2 Respostas

Rafael_Carneiro

Faça:

public void persist(T t) throws DaoException {  
        try {  
            // mDATAS.BeginTransaction();  
             mDATAS.getManager().persist(t);  
             mDATAS.getManager().flush();  
           //  mDATAS.CommitTransaction();  
         } catch(Exception e) {  
             throw new DaoException(getErrorCode(METHOD_PERSIST), "Can not insert", e);  
        // }finally{  
         //   mDATAS.Close();  
        // }
mDATAS.BeginTransaction();  

 for (int w=1;w<3;w++){  
   
     dao = new UserDao();  
     user = new User();  
     user.setName("New Company "+w);        
     dao.persist(company);      
 }  

mDATAS.CommitTransaction(); 
mDATAS.Close();
gf1985

Boa tarde pessoal!
Estou tendo um problema semelhante.
Tenho um sistema web e utilizo “application-managed entity manager”, ou seja, uso EntityManagerFactory com singleton.
O sistema web dispara um simples, porém longo processo de importação de dados onde crio uma thread e o processo fica rotando em segundo plano. Até ai tudo bem.
Depois que o processo esta rodando há algumas horas, acontece o seguinte erro:

[1/28/10 20:19:14:891 WGT] 00000556 SystemErr R Exception in thread “Thread-
177” java.lang.IllegalStateException: EntityManager is closed

Minhas classes DAO são bem simples:

public void CadastrarTipo(int codTipo, String nome) {
		Tipo tipo = new Tipo();
		tipo.setTipo(codTipo);
		tipo.setNome(nome);
		try {
			em.getTransaction().begin();
			em.persist(tipo);
			em.getTransaction().commit();
		} finally {
			em.close();
		}
	}

Este método de cadastro, por exemplo, é executado milhares de vezes… E eu não sei a hora certa de criar ou finalizar a transaction ou o entitymanager…
Se alguém puder me orientar…
Obrigado.

Criado 8 de janeiro de 2009
Ultima resposta 1 de fev. de 2010
Respostas 2
Participantes 3