Pegar conexão JPA para Imprimir e chamar store procedure
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;
}
}
}
Victor Lima
Curtidas 0
Respostas
Dyego Carmo
03/12/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.)
GOSTEI 0
Victor Lima
03/12/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
Como vc disse q sabe, vc sabe me dizer o trecho de codigo incluindo os imports q fazem essa funcionadade.
Abracos
GOSTEI 0
Victor Lima
03/12/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
Como vc disse q sabe, vc sabe me dizer o trecho de codigo incluindo os imports q fazem essa funcionadade.
Abracos
GOSTEI 0
Dyego Carmo
03/12/2009
Mostra aqui o erro de CAST que voce esta recebdno...
GOSTEI 0
Victor Lima
03/12/2009
Valeuu,
Ja consegui aki,
obrigado.
Ja consegui aki,
obrigado.
GOSTEI 0