Hibernate (OpenSession in View) - createCriteria is not valid without active transaction

5 respostas
F
Boa tarde galera, sempre usei Open Session in View nas minhas aplicações, só que agora precisei criar agendamentos no Quartz. Só que ao tentar executar algo com o Hibernate por algum agendamento do Quartz, ele da o erro:
SEVERE: org.hibernate.HibernateException: createCriteria is not valid without active transaction
	at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:348)
	at com.sun.proxy.$Proxy153.createCriteria(Unknown Source)
	at br.com.zanzini.dao.VendedorDao.getVendedorByCod(VendedorDao.java:33)
	at br.vendas.integracao.VendedorIntegra.tratarVendedor(VendedorIntegra.java:108)
	at br.vendas.integracao.VendedorIntegra.exportaVendedor(VendedorIntegra.java:60)
	at br.vendas.job.ExportaVendedor.execute(ExportaVendedor.java:31)
	at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)

SEVERE: 	at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:348)
SEVERE: 	at com.sun.proxy.$Proxy153.createCriteria(Unknown Source)
SEVERE: 	at br.com.zanzini.dao.VendedorDao.getVendedorByCod(VendedorDao.java:33)
SEVERE: 	at br.vendas.integracao.VendedorIntegra.tratarVendedor(VendedorIntegra.java:108)
SEVERE: 	at br.vendas.integracao.VendedorIntegra.exportaVendedor(VendedorIntegra.java:60)
SEVERE: 	at br.vendas.job.ExportaVendedor.execute(ExportaVendedor.java:31)
SEVERE: 	at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
SEVERE: 	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Não sei muito a respeito, mas creio que tem algo a ver com o Filter e com Session.

Quais opções eu tenho para contornar esse erro e conseguir usar minha conexão do Hibernate?

Obrigado.
Abraço!

5 Respostas

Hebert_Coelho

Abra a transação na mão e feche depois. [=

F

Teria como você verificar se eu montarei isso corretamente? Fazendo um grande favor.

<blockquote>            SessionFactory sf = HibernateUtil.getSessionFactory();

sf.getCurrentSession().beginTransaction();

sf.getCurrentSession().getTransaction().commit();

ven = new VendedorDao().getVendedorByCod(Long.parseLong(split[0]));

sf.close();</blockquote>
F

Ou isso: (?)

SessionFactory sf = HibernateUtil.getSessionFactory(); try { sf.getCurrentSession().beginTransaction(); sf.getCurrentSession().getTransaction().commit(); ven = new VendedorDao().getVendedorByCod(Long.parseLong(split[0])); } finally { if (!sf.isClosed()) { sf.close(); } }

F

Consegui fazer funcionar assim:

try { sf.getCurrentSession().beginTransaction(); ven = new VendedorDao().getVendedorByCod(Long.parseLong(split[0])); sf.getCurrentSession().getTransaction().commit(); } finally { }
Não pude deixar o sf.close(), que se não dava erro.
Minha preocupação com isso é, a conexão está ficando aberta?

Hebert_Coelho

faelzindc:
Consegui fazer funcionar assim:

try { sf.getCurrentSession().beginTransaction(); ven = new VendedorDao().getVendedorByCod(Long.parseLong(split[0])); sf.getCurrentSession().getTransaction().commit(); } finally { }
Não pude deixar o sf.close(), que se não dava erro.
Minha preocupação com isso é, a conexão está ficando aberta?

Sempre feche a conexão. Não sei como funciona a sessão do hibernate mas eu imagino que fique aberta.

Criado 23 de abril de 2013
Ultima resposta 23 de abr. de 2013
Respostas 5
Participantes 2