mudar de EntityManage para Session
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
Curtidas 0
Respostas
Ronaldo Lanhellas
14/01/2015
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;
}
GOSTEI 0
John Lima
14/01/2015
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;
}
}
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
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.
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
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.
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
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.
GOSTEI 0
John Lima
14/01/2015
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
position beyond number of declared ordinal parameters. remember that ordinal parameters are 1-based
poderia da um exemplo da sugestão acima
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
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
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(...);
}
}
GOSTEI 0
John Lima
14/01/2015
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 ?
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 ?
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
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 ?
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.
GOSTEI 0
John Lima
14/01/2015
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();
}
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
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.
GOSTEI 0
John Lima
14/01/2015
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
);
}
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
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.
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
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.
GOSTEI 0
John Lima
14/01/2015
é um método do próprio framwork, porem como o OpenSwing é openSource acho que poderia ser mudado mas não sei como =\
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
é um método do próprio framwork, porem como o OpenSwing é openSource acho que poderia ser mudado mas não sei como =\
NEsse caso é masi complicado, pois a única forma de forma mudar seria recompilando o OpenSwing, já que ele só aceita um Session do Hibernate.
GOSTEI 0
Ronaldo Lanhellas
14/01/2015
é um método do próprio framwork, porem como o OpenSwing é openSource acho que poderia ser mudado mas não sei como =\
NEsse caso é masi complicado, pois a única forma de forma mudar seria recompilando o OpenSwing, já que ele só aceita um Session do Hibernate.
GOSTEI 0