Ajuda design patterns jpa

5 respostas
fabioebner
pessoal tenho a seguinte classe:
public class FuncoesBanco {

    private static EntityManagerFactory emf;

    private EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public FuncoesBanco() {
        emf = Persistence.createEntityManagerFactory("CaixaPU");
    }

    public boolean persist(Object obj) {
        EntityManager em = getEntityManager();
        try {
            em.getTransaction().begin();
            em.persist(obj);
            em.getTransaction().commit();
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            em.getTransaction().rollback();
            return false;
        } finally {
            em.close();
        }
    }

    public boolean update(Object obj) {
        EntityManager em = getEntityManager();
        try {
            em.getTransaction().begin();
            em.merge(obj);
            em.getTransaction().commit();
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            em.getTransaction().rollback();
            return false;
        } finally {
            em.close();
        }
    }

    public boolean delete(Object obj) {
        EntityManager em = getEntityManager();
        try {
            em.getTransaction().begin();
            obj = em.merge(obj);
            em.remove(obj);
            em.getTransaction().commit();
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            em.getTransaction().rollback();
            return false;
        } finally {
            em.close();
        }
    }
}

como eu faco para transformar essa classe igual a um design patterns de conexao?? pois eu preciso abrir conexao em um determinado ponto.. executar algumas operacoes de exclusao, alteracao, inclusao e depois no final fechar a conexao.. porem nao posso perder essa conexao..

qdo e com jdc eu sei fazer.. porem nao sei se e a mesma coisa para jpa

obrigado

5 Respostas

fantomas

Se entendi bem seu problema diria que vc deve procurar algum tutorial ou apostila sobre o pattern DAO com JPA/HIBERNATE. Talvez aqui no guj mesmo tenha alguma.

[]'s

victor.godinho

Não sei se deve ter um Design Pattern por ai com essa finalidade, mas pensando rápido, você poderia fazer assim:

1º troque o “em.close()”, pela chamada de um método, exemplo:

private void closeEntityManager(EntityManager em) {
     //...
}

Depois, você precisaria fazer um poll de EntityManager e trabalhar com eles, exemplo:

private ThreadLocal<EntityManager> threadLocal = new ThreadLocal<EntityManager>();


private EntityManager getEntityManager() {  
		EntityManager toReturn = threadLocal.get();
		
		if (toReturn == null){
			toReturn = emf.createEntityManager();
			threadLocal.set(toReturn);
		}
		
		return toReturn;
}

Só que agora, para fechar a conexão apenas no fim da chamada de todos os métodos, kara… não rola, não tem como você adivinhar quando o kara não vai querer mais usar a referência, ou quando para o cliente (classe que for usar) aquela quantidade de chamadas, representou um bloco de informações…

Você pode fazer um método chamada sei lá… “public void flush() throws Exception {” por exemplo, e ai nele você comita e faz o que mais quizer…

Espero que tenha ajudado em algo.

Falows

victor.godinho

fantomas , o design pattern DAO, não chega nesse nível de referência, ele define mais a divisão entre o acesso ao repositório do que manipulação gerenciamento de transaction’s/connection’s entre métodos.

Mas repetindo não sei se alguém já inventou um Pattern exatamente pra isso, mas bem… Design Pattern é apenas um modelo, sempre existe um, mesmo que seja um modelo para cada pessoa, mas que há, há, e se não tiver nenhum mesmo em comum pela comunidade, adote, melhore e divulgue! :smiley:

Falows

fantomas

Dá uma olhada neste tópico aqui do guj para ir ficando por dentro do que se trata http://www.guj.com.br/posts/list/58773.java

[]'s

fantomas

victor.godinho:
fantomas , o design pattern DAO, não chega nesse nível de referência, ele define mais a divisão entre o acesso ao repositório do que manipulação gerenciamento de transaction’s/connection’s entre métodos.

Mas repetindo não sei se alguém já inventou um Pattern exatamente pra isso, mas bem… Design Pattern é apenas um modelo, sempre existe um, mesmo que seja um modelo para cada pessoa, mas que há, há, e se não tiver nenhum mesmo em comum pela comunidade, adote, melhore e divulgue!

Concordo com vc vitor, mas do jeito está o código apresentado, na minha opinião, já tem que começar a acertas as coisa já partindo dos acessos, porisso indiquei o DAO pra começar.

Mas pensando melhor parece que existe um coisa chamada OpenSessionInView/Filter/Interceptor (não é pattern) que talvez possa ajudar.

[]'s

Criado 7 de agosto de 2008
Ultima resposta 7 de ago. de 2008
Respostas 5
Participantes 3