Fórum mudar de EntityManage para Session #507324

14/01/2015

0

Boa noite tenho um método para executar uma query usando o entitymanager gostaria de saber como ficaria usando o Session


 protected EntityManager getEm() {
        em = EntityManagerUtil.getEntityManager();
     
        return em;
    }

 protected Query createQuery(String query, Object... values) {
        Query qr = getEm().createQuery(query);

        //Query qr = getEntityManager().createNamedQuery(query);
        if (values != null) {
            for (int i = 0; i < values.length; i++) {
                Object obj = values[i];
                qr.setParameter(i + 1, obj);

            }
        }
        return qr;
    }
John Lima

John Lima

Responder

Posts

16/01/2015

Ronaldo Lanhellas

Em poucos passos:

 private static SessionFactory factory; 

protected EntityManager getEm() {
       em = EntityManagerUtil.getEntityManager();
     
       return em;
   }

private Session getSession(){
if (factory == null){
   factory = new Configuration().configure().buildSessionFactory();
}

return factory.openSession();
}
 
protected Query createQuery(String query, Object... values) {
       Query qr = getSession().createQuery(query);
 
       //Query qr = getSession().createNamedQuery(query);
       if (values != null) {
           for (int i = 0; i < values.length; i++) {
               Object obj = values[i];
               qr.setParameter(i + 1, obj);
 
           }
       }
       return qr;
   }
Responder

Gostei + 0

16/01/2015

John Lima

Só que eu teria que muda algumas coisa nesses outros métodos a baixo pois o pacote que usei para criar essa query não foi do Hibernate, sendo assim meu getSingleResult() iria mudar para uniqueResult() e o qr.getResultList(). Seria essas as mudanças ?

protected <T> T getPurePojo(Class<T> classTocast, String query, Object... values) {
        try {
            iniciarTransacao();
            Query qr = createQuery(query, values);
            T toReturn;
            toReturn = (T) qr.getSingleResult();
            commitTransacao();
            return toReturn;
        } catch (Exception e) {
            rollbackTransacao();
            UtilMensagens.mensagemErro("Transação não realizada erro \n: "
                    + UtilErros.getMensagemErro(e));
            return null;
        }

    }





 protected <T> List<T> getList(Class<T> classTocast, String query, Object... values) {
        try {
            iniciarTransacao();
            Query qr = createQuery(query, values);
            List<T> toReturn = qr.getResultList();
            commitTransacao();
            return toReturn;
        } catch (Exception e) {
            rollbackTransacao();
            UtilMensagens.mensagemErro("Transação não realizada erro \n: "
                    + UtilErros.getMensagemErro(e));
            return null;          

        }
    }
Responder

Gostei + 0

16/01/2015

Ronaldo Lanhellas

Isso mesmo, seria interessante você criar uma interface para abstrair se está trabalhando com session ou entitymanager, desta forma vocÊ instância o que irá usar.
Responder

Gostei + 0

16/01/2015

Ronaldo Lanhellas

Isso mesmo, seria interessante você criar uma interface para abstrair se está trabalhando com session ou entitymanager, desta forma vocÊ instância o que irá usar.
Responder

Gostei + 0

16/01/2015

Ronaldo Lanhellas

Isso mesmo, seria interessante você criar uma interface para abstrair se está trabalhando com session ou entitymanager, desta forma vocÊ instância o que irá usar.
Responder

Gostei + 0

16/01/2015

John Lima

Ronaldo na chamada do método estou com um problema nos paramentos passado :

position beyond number of declared ordinal parameters. remember that ordinal parameters are 1-based

poderia da um exemplo da sugestão acima
Responder

Gostei + 0

16/01/2015

Ronaldo Lanhellas

Ronaldo na chamada do método estou com um problema nos paramentos passado :

position beyond number of declared ordinal parameters. remember that ordinal parameters are 1-based

poderia da um exemplo da sugestão acima


Em relação ao erro, você tem que iniciar do valor 0 no setParameter e não do valor 1, então o certo seria:

qr.setParameter(i, obj); //Onde i = 0, 1 ,2 ,3 ...


Um exemplo do uso de interfaces seria:

public interface MeuDAO{
   ..
}

public class MeuDAOSessionImpl implements MeuDAO{
   
    //métodos necessário para criar query usando SESSION
       
}

public class MeuDAOEntityManagerImpl implements MeuDAO{
   
    //métodos necessário para criar query usando EntityManager
       
}


public class MainApp{

  public static void main(String args[]){
     //Quando quiser usar Session
     MeuDAO md = new MeuDAOSessionImpl();
     
          //Quando quiser usar EntityManager
     MeuDAO md = new MeuDAOEntityManagerImpl();
     
     //Ambos tem os mesmo métodos
     md.createQuery(...);
  }

}


Responder

Gostei + 0

16/01/2015

John Lima

hummm entedir Ronaldo, porém se eu eu fizer assim qr.setParameter(i, obj);

teria que usar a query assim :
select b from Banco b where b.nome like ?
em vez
select b from Banco b where b.nome like ?1, porem se existir a troca de parâmetro ele vai funcionar ?
Responder

Gostei + 0

16/01/2015

Ronaldo Lanhellas

hummm entedir Ronaldo, porém se eu eu fizer assim qr.setParameter(i, obj);

teria que usar a query assim :
select b from Banco b where b.nome like ?
em vez
select b from Banco b where b.nome like ?1, porem se existir a troca de parâmetro ele vai funcionar ?


Você não precisa colocar o número "1" depois do like, apenas o ponto de integorração e o próprio hibernate irá ordenar na sequencia em que está sendo lido.
Responder

Gostei + 0

16/01/2015

John Lima

Ok Ronaldo apenas mais uma duvida, você optaria por usar o Session ou EntityManager. Para iniciar ou o Session com Hibernate.cfg qual o método mais indicado ?


   public Session getSession() {
        if (factory == null) {
            factory = new Configuration().configure().buildSessionFactory();
        }
        return factory.openSession();
    }

ou

  if(session==null){
            session = HibernateUtil.getSessionFactory().openSession();
        }

Responder

Gostei + 0

16/01/2015

Ronaldo Lanhellas

Ok Ronaldo apenas mais uma duvida, você optaria por usar o Session ou EntityManager. Para iniciar ou o Session com Hibernate.cfg qual o método mais indicado ?


   public Session getSession() {
        if (factory == null) {
            factory = new Configuration().configure().buildSessionFactory();
        }
        return factory.openSession();
    }

ou

  if(session==null){
            session = HibernateUtil.getSessionFactory().openSession();
        }



Eu usaria e uso o EntityManager, por tratar-se de uma abstração mais o JPA e não a um framework em específico como Hibernate ou TopLink. Se amanhã eu resolver trocar de Hibernate para TopLink, não terei problema algum.
Responder

Gostei + 0

17/01/2015

John Lima

Realmente concordo com Você Ronaldo porem, estou usando o Session por causa do OpenSwing como estamos na época da programação rápida ele parece ser o mais adequado a usar, porem se tivesse como adequar o EntityManage dentro desse bloco aqui seria o máximo porque iria usar o entityManager ao invés do Session.


1ublic static Response getAllFromQuery(
    Map filteredColumns,
    ArrayList currentSortedColumns,
    ArrayList currentSortedVersusColumns,
    Class valueObjectType,
    String baseSQL,
    Object[] paramValues,
    Type[] paramTypes,
    String tableName,
    SessionFactory sessions,
    Session sess
  ) throws Exception {
    return getAllFromQuery(
    new HashMap(),
    filteredColumns,
    currentSortedColumns,
    currentSortedVersusColumns,
    valueObjectType,
    baseSQL,
    paramValues,
    paramTypes,
    tableName,
    sessions,
    sess
    );
  }
Responder

Gostei + 0

19/01/2015

Ronaldo Lanhellas

Realmente concordo com Você Ronaldo porem, estou usando o Session por causa do OpenSwing como estamos na época da programação rápida ele parece ser o mais adequado a usar, porem se tivesse como adequar o EntityManage dentro desse bloco aqui seria o máximo porque iria usar o entityManager ao invés do Session.


1ublic static Response getAllFromQuery(
    Map filteredColumns,
    ArrayList currentSortedColumns,
    ArrayList currentSortedVersusColumns,
    Class valueObjectType,
    String baseSQL,
    Object[] paramValues,
    Type[] paramTypes,
    String tableName,
    SessionFactory sessions,
    Session sess
  ) throws Exception {
    return getAllFromQuery(
    new HashMap(),
    filteredColumns,
    currentSortedColumns,
    currentSortedVersusColumns,
    valueObjectType,
    baseSQL,
    paramValues,
    paramTypes,
    tableName,
    sessions,
    sess
    );
  }


Se esse método foi você quem criou então é fácil adaptar, pode até fazer um overload dele.
Responder

Gostei + 0

19/01/2015

Ronaldo Lanhellas

Realmente concordo com Você Ronaldo porem, estou usando o Session por causa do OpenSwing como estamos na época da programação rápida ele parece ser o mais adequado a usar, porem se tivesse como adequar o EntityManage dentro desse bloco aqui seria o máximo porque iria usar o entityManager ao invés do Session.


1ublic static Response getAllFromQuery(
    Map filteredColumns,
    ArrayList currentSortedColumns,
    ArrayList currentSortedVersusColumns,
    Class valueObjectType,
    String baseSQL,
    Object[] paramValues,
    Type[] paramTypes,
    String tableName,
    SessionFactory sessions,
    Session sess
  ) throws Exception {
    return getAllFromQuery(
    new HashMap(),
    filteredColumns,
    currentSortedColumns,
    currentSortedVersusColumns,
    valueObjectType,
    baseSQL,
    paramValues,
    paramTypes,
    tableName,
    sessions,
    sess
    );
  }


Se esse método foi você quem criou então é fácil adaptar, pode até fazer um overload dele.
Responder

Gostei + 0

19/01/2015

John Lima

é um método do próprio framwork, porem como o OpenSwing é openSource acho que poderia ser mudado mas não sei como =\
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar