Hibernate pedindo transação no get/load, pode?

9 respostas
dooda

Buenas pessoal, fazendo alguns teste aqui com Hibernate,

Save, Update, Remove com transação ta blza…

mas quando tento um Get ou Load de uma entidade já persistida…
ele diz que não há uma transação ativa… :?

Pode uma coisa dessa? devo ter feito algo errado… :oops:

Obrigado, grande abraço!!!
:wink:

9 Respostas

Jair_Rillo_Junior

Esse seu get é de um atributo simples (por exemplo getNome) ou é de outra entidade (por exemplo: getCidade) ?

Se for de uma entidade, tem que ter certeza que a transação está ativa, ou então tem que usar o FetchType.EAGER, ou ainda fazer um find usando JOIN FETCH

dooda

BuEnAs Jair…

Ainda é o get da propria entidade, na session do hibernate como segue…
para essas manipulações fiz uma classe intermediária, mas acho que isso nao influi…

package com.erp.persistence;

import java.io.Serializable;
import org.hibernate.Session;
import com.erp.bean.Entity;

public class PersistenceUtil {

	private static final PersistenceUtil me = new PersistenceUtil();

	private PersistenceUtil() {}
	
	private Session getSession(){
		return HibernateUtil.getSessionFactory().getCurrentSession();
	}
	
	public Serializable insert(Entity aEntity) {
		return getSession().save(aEntity);
	}

	public void update(Entity aEntity) {
		getSession().update(aEntity);
	}

	public void delete(Entity aEntity) {
		getSession().delete(aEntity);
	}

	public Entity findById(Class aClass, Serializable aId) {
		return (Entity) getSession().get(aClass, aId);
	}

	public void beginTransaction() {
		getSession().beginTransaction();
	}

	public void commitTransaction() {
		getSession().getTransaction().commit();
	}

	public void rollbackTransaction() {
		getSession().getTransaction().rollback();
	}

	public static final PersistenceUtil getInstance() {
		return me;
	}
}

Naquele FindById o problema…
mas se eu abrir uma transação antes de executar (o que acredito não ter lógica), não acontece o erro…

abraço!!

Jair_Rillo_Junior

Eu tinha entendido errado :oops:
Eu pensei que era os métodos getters and setters.

Bom, em específico do hibernate eu não sei, porém segundo a especificação da JPA, tanto o método find e getReference não precisam estar associados a uma transação. No caso do Hibernate eu não sei te dizer

ThiagoWorldCoder

não precisa. :smiley:

dooda

pois é, eu sempre pensei que não, mas ele “The Hibernate” está xaropiando… :wink:

deve ter algo errado em outro lugar, vou dar uma acompanhada mais afundo…

Vallew’s
Abraço!!

Rubem_Azenha

Você esta tentando alterar o objeto obtido pelo Hibernate?

Quando você altera um objeto, ele fica no estado managed e o Hibernate faz o update de todos os objetos manageds que tiveram o seu estado alterado.
http://www.hibernate.org/hib_docs/reference/en/html/objectstate.html#objectstate-modifying

Posta o código completo e a stacktrace.

dooda

O Código que busca a cidade dentro do JFrame seria este:

private boolean buscaCidade() {
        try{
//            PersistenceUtil.getInstance().beginTransaction();
            try {
                cidade = cidadeDao.findById(Integer.valueOf(jtfBusca.getText()));
                return !cidade.equals(null);
            } catch (Exception ex) {
                Logger.getLogger(CadCidade.class.getName()).log(Level.SEVERE, null, ex);
                return false;
            }
        }finally{
//            PersistenceUtil.getInstance().rollbackTransaction();
        }
    }

e o erro é este ai…

compile:
run:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
28/07/2008 23:28:02 erp.CadCidade buscaCidade
SEVERE: null
org.hibernate.HibernateException: get is not valid without active transaction
        at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297)
        at $Proxy17.get(Unknown Source)
        at com.erp.persistence.PersistenceUtil.findById(PersistenceUtil.java:35)
        at com.erp.dao.CidadeDAO.findById(CidadeDAO.java:20)
        at erp.CadCidade.buscaCidade(CadCidade.java:77)
        at erp.CadCidade.jbtBuscaActionPerformed(CadCidade.java:365)
        at erp.CadCidade.access$200(CadCidade.java:38)
        at erp.CadCidade$3.actionPerformed(CadCidade.java:179)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:337)
        at erp.CadCidade.keyPressed(CadCidade.java:488)
        at java.awt.Component.processKeyEvent(Component.java:5996)
        at javax.swing.JComponent.processKeyEvent(JComponent.java:2794)
        at java.awt.Component.processEvent(Component.java:5815)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
        at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693)
        at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958)
        at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830)
        at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657)
        at java.awt.Component.dispatchEventImpl(Component.java:4282)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Teria eu interpretado a msg erroneamente?? =P

Abraço!!!

ThiagoWorldCoder

Isso já aconteceu comigo, só que eu não me lembro o que eu fiz pra resolver… mas, olhando bem o seu código, eu percebi que o erro está a partir do seu PersistenceUtil!
Observe bem o como você fez o seu PersistenceUtil, que erro está por lá… caso contrário, posta o código aí!!

dooda

Buenas Thiago, sou Javeiro e nao desisto nunca… :smiley:

Realmente tem algo de errado por aqui, mas nao consigo achar, creio nao ser meu
PersistenceUtil, por que fiz diretamente pelo Session do hibernate:

Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
			e = (Endereco)sessao.get(Endereco.class, 456);

Sendo que HibernateUtil é este:

package com.erp.persistence;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {
	
	private static final SessionFactory sessionFactory;
	
	static {
		try {
			// Create the SessionFactory from hibernate.cfg.xml
			sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

e o erro:

org.hibernate.HibernateException: get is not valid without active transaction
	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297)
	at $Proxy17.get(Unknown Source)
	at com.erp.app.TestePessoa.main(TestePessoa.java:52)

e ele continua xaropeando…
Mas vallew pela força, pelo menos sei que alguem mais já passou por essa…

Grande abraço!!!

Criado 28 de julho de 2008
Ultima resposta 30 de jul. de 2008
Respostas 9
Participantes 4