Singleton e Jpa

8 respostas
A

Estou com um problema pra gerenciar meus entitnyManager e o Factory.

Eu criei uma classe singleton pra gerar eles assim:

package br.com.projetos.sisCorp.dao;

import java.io.Serializable;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class ConnectionFactory implements Serializable {  
	
	
  
  static EntityManagerFactory emF = null;  
    
   static EntityManager em = null;  
  
  public static EntityManager getEntityManager() {  
	  
	
	  
     try{
     
  
     // se ainda não existir um entityManagerFactory... obtém a instância e atribui ao atributo estático  
     if ( emF == null ) {  
       emF = Persistence.createEntityManagerFactory("conexao");  
     }  
     em = emF.createEntityManager();
     
     
     }
     catch(Exception e)
     {
    	 e.printStackTrace();
     }
  
    
     // retorna o EntityManager... ou uma instância nova (se for a primeira chamada) ou a mesma instância (para chamadas posteriores)...  
     return em;  
    
  }  
  
}

e meu dao herdando ele:

public class ProdutoDao extends ConnectionFactory {
	
	//Mapeamento persistence;
	
	
	
	  
	
	public ProdutoDao(){
	 //construtor ja chama a conexão
	
		getEntityManager();
		
	}
	

	public void insert(Produto produtos) {
		try{
		//	persistence = new ProdutoController();
			//getEntityManager();
		em.getTransaction().begin();
		em.persist(produtos);
		em.getTransaction().commit();
		em.close();
		}
		catch(Exception e) {
			e.printStackTrace();
			//em.close();
		}
}
	
	//lista com criteria
		@SuppressWarnings({ "unchecked", "rawtypes" })
		public List<Produto> list() {
			getEntityManager();
			
				CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); 
				cq.select(cq.from(Produto.class)); 
				return em.createQuery(cq).getResultList(); 
				
				}
	//metodo deletar
	public void delete(Produto produtos) {
	  
		try{
		//	em = emF.createEntityManager();
			em.getTransaction().begin();
			em.remove(produtos);
			em.getTransaction().commit();
			em.close();
			}
		catch(Exception e) {
			e.printStackTrace();
			//em.close();
		}
	}
	  
	public void update(Produto produtos) {
		// TODO Auto-generated method stub
		try{
            // em=emF.createEntityManager();
			em.getTransaction().begin();
			em.merge(produtos);
			em.getTransaction().commit();
			em.close();
			}
			finally {
			
			}
	}


	
}

Qual o problema? o update, ele simplesmente não atualiza .
lembrando que estou ultilizando JSF na view.

Mas antes de eu usar o singleton, criando os EM e EMF dentro do proprio dao, o update funcionava.
porem era muito lerdo, assim ficou muito bom a velocidade das transações, porem o update nao funciona.
alguem?

8 Respostas

igor_ks

O fato de não estar funcionando o update, não consegui identificar apenas olhando o código. Poste o erro que dá que ficará mais fácil.

Dica: Você está usando herança de uma forma errada… não faz sentido algum um DAO extender de ConnectionFactory…
Coisas que vc poderia fazer:

  • Criar um DAO Generico, e lá você tem um getEntityManager()
  • Como seu método é estático, você pode acessar ele diretamente
ConnectionFactory.getEntityManager()
A

não aparece erro algum:

veja o controller:

//metodo

public void onEdit(RowEditEvent event) {  
		Produto produtoTemp = (Produto)(listaProdutos.getRowData());
		prodDao.update(produtoTemp);
       FacesMessage msg = new FacesMessage("Produto Edited", ((Produto) event.getObject()).getNomeProduto());  
       
       FacesContext.getCurrentInstance().addMessage(null, msg);  
       
      
       
   }

antes funcionava, mas depois q usei singleton nao funciona mais… simplesmente nao atualiza.

A

Alguemm?

igor_ks

Cara, depura seu código e veja se no momento do método update do seu ProdutoDao, ta chegando o objeto alterado

A

cara , eu não sei debugar.
como debuga?
aqui ao clicar em debugar abre pra rodar no tomcat, nao entendi nada.

Felipe_Amaral_R

To nesse mesmo caminho, até esse final de semana resolvo oq fazer kk
http://www.guj.com.br/17306-jpautil---dao-generico

A

pior que eu to com pressa, e ninguem me ajuda :frowning:

rod_badboy

Fala ae adam_sandler.

Se você usa o Eclipse, deve ter uma Perspectiva chamada Server, onde fica o Application Server (TomCat, JBoss etc).
Clique sobre o mesmo com o botão direito do mouse e escolha a opção para iniciar o Application Server com o modo Debug (desenho de um besouro) e Não o Start.
Dê um duplo clique na primeira linha ativa (não comentada) dos seus métodos onEdit e update. Esse duplo clique deve ser no lado esquerdo, onde fica o número da linha. Aparecerá uma bola azul no local do duplo clique.

Quando você executar sua JSP para chegar no método onEdit o Eclipse irá automaticamente abrir (ou perguntar se você quer abrir) a Perspectiva Debug, que é a visão do Eclipse para trabalhar debugar a aplicação.
Ele estará parado na linha do seu método onEdit que você marcou com o duplo clique.
Para percorrer o método, linha a linha, utilize a seta chamada (deixe o mouse sobre a mesma para ler) Step Over.
Nesta tela de Perspectiva Debug tem uma aba chamada Variables. Nela é mostrado a você os atributos criados e seus valores.
Quando o debug estiver sobre a linha “prodDao.update(produtoTemp);” clique novamente na seta de Step Over e ele irá para o ponto marcado com o duplo clique do seu método update, no seu Dao.
Olhe na aba Variables se seu objeto passado está instanciado, criado e populado. Pode clicar sobre as informações em Variables.
Quando quiser continuar a prosseguir normalmente, saindo do debug, clique sobre o botão Resume (Play Verde).

Se eu não tiver conseguido te ajudar, procure algum vídeo ou tutorial de como debugar no Eclipse.

Outra coisa, até mesmo antes de debugar para ser mais rápido, coloque o bloco catch(Exception e) no seu método update, do Dao, assim como você fez em insert e delete. O printStackTrace deve dizer qual o problema, se houver algum.

Abraço ae Ator…

Criado 27 de março de 2014
Ultima resposta 22 de ago. de 2014
Respostas 8
Participantes 4