Array
(
)

Pegar conexão JPA para Imprimir e chamar store procedure

Victor Lima
   - 03 dez 2009


 Bom dia Pessoal.

 Estou desenvolvendo uma aplicação que utiliza JPA , Spring,Hibernate,RichFaces , e em meu arquivo persistence.xml contem as configuraçoes de acesso ao banco de dados e drives.

 Preciso em varias partes do programa realizar geração de relatorios e executar procedures, mas o que nao tenho ideia é de como vou pegar a conexão do banco , porque ate o momento dentro do codigo estou criando uma conexão com os dados do banco que ja existem no persistence.xml.

 Utilizo uma classe para fazer todas as operacoes de CRUD  a seguir:

package br.com.webtracking.dao.imp;

import br.com.webtracking.dao.DaoGenerico;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public class DaoGenericoImp<T, ID extends Serializable>
implements DaoGenerico<T, ID> {

    private EntityManager entityManager;

    private final Class<T> oClass;//object class

    public Class<T> getObjectClass() {
        return this.oClass;
    }

    @SuppressWarnings("unchecked")
    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this.entityManager = em;
    }

    protected EntityManager getEntityManager() {
        if (entityManager == null)
            throw new IllegalStateException("Erro");
        return entityManager;
    }

    @SuppressWarnings("unchecked")
    public DaoGenericoImp() {
        this.oClass = (Class<T>)
        ( (ParameterizedType) getClass().getGenericSuperclass() ).
        getActualTypeArguments()[0];

    }

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public T atualizar(T object) {
        getEntityManager().merge(object);

        return object;

    }

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void excluir(T object) {
        object = getEntityManager().merge(object);
        getEntityManager().remove(object);
    }

    @Override
    public T pesquisarPorId(ID id) {
        return (T) getEntityManager().find(oClass, id);
    }

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public T salvar(T object) {
        getEntityManager().clear();
        getEntityManager().persist(object);

        return object;
    }

    @SuppressWarnings("unchecked")
    public List<T> todos(){
        String queryS = "SELECT obj FROM "+oClass.getSimpleName()+" obj ORDER BY obj ASC";
        Query query = getEntityManager().createQuery(queryS);
        return query.getResultList();

    }

    @SuppressWarnings("unchecked")
    public List<T> todosActive(){
        String queryS = "SELECT obj FROM "+oClass.getSimpleName()+" obj WHERE obj = true";
        Query query = getEntityManager().createQuery(queryS);
        return query.getResultList();

    }

    @SuppressWarnings("unchecked")
    public List<T> listPesqParam(String query, Map<String, Object> params){
        Query q = getEntityManager().createQuery(query);
        for(String chave : params.keySet()){
            q.setParameter(chave, params.get(chave));

        }
        return q.getResultList();
    }

    @SuppressWarnings("unchecked")
    public List<T> listPesqParam(String query, Map<String, Object> params,
            int maximo, int atual){
        Query q = getEntityManager().
                    createQuery(query).
                    setMaxResults(maximo).
                    setFirstResult(atual);

        for(String chave : params.keySet()){
            q.setParameter(chave, params.get(chave));

        }
        return q.getResultList();
    }

    @SuppressWarnings("unchecked")
    public List<T> listPesq(String query){
        Query q = getEntityManager().createQuery(query);
        return q.getResultList();
    }

    @SuppressWarnings("unchecked")
    public T pesqParam(String query, Map<String, Object> params){
        Query q = getEntityManager().createQuery(query);
        for(String chave : params.keySet()){
            q.setParameter(chave, params.get(chave));

        }
        try{
            return (T) q.getSingleResult();
        }catch(NoResultException nre){
            return null;
        }
    }

}

Dyego Carmo
   - 11 dez 2009

O entityManager contem um metodo que retorna a Connection utilizada no banco de dados... e voce tambem pode utilizar ele para criar uma query nativa no banco (o que vai ter o mesmo resultado pratico.)

0
|
0

Victor Lima
   - 12 dez 2009

Olá, q funciona eu sei, eu só nao sei o comando q eu tenho q fazer para pegar a conexao, pois eu estou tentando utilizar o trecho de codigo ( (HibernateEntityManager) entityManager ).getSession().connection();, sendo q me e apresentado um erro de cast.
Como vc disse q sabe, vc  sabe me dizer o trecho de codigo incluindo os imports q fazem essa funcionadade.

Abracos

0
|
0

Victor Lima
   - 12 dez 2009

Olá, q funciona eu sei, eu só nao sei o comando q eu tenho q fazer para pegar a conexao, pois eu estou tentando utilizar o trecho de codigo ( (HibernateEntityManager) entityManager ).getSession().connection();, sendo q me e apresentado um erro de cast.
Como vc disse q sabe, vc  sabe me dizer o trecho de codigo incluindo os imports q fazem essa funcionadade.

Abracos

0
|
0

Dyego Carmo
   - 16 dez 2009

Mostra aqui o erro de CAST que voce esta recebdno...

0
|
0

Victor Lima
   - 16 dez 2009

Valeuu,

Ja consegui aki,

obrigado.

0
|
0