Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

erro depois que criei o EntitiManagerProducer

depois de criar a classe e o metodo anotado com @Produces me aparece este erro

Ago 15, 2014 7:13:15 PM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
java.lang.IllegalStateException: Transaction already active
    at org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:58)
    at br.com.caelum.vraptor.dao.ProdutoDao.adiciona(ProdutoDao.java:24)
    at br.com.caelum.vraptor.observers.InitialDataObserver.insert(InitialDataObserver.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253)
    at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232)
    at org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169)
    at org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:165)
    at org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:119)
    at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:112)
    at org.jboss.weld.event.EventImpl.fire(EventImpl.java:83)
    at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:92)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4809)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5485)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
5 respostas

Entra na classe InitialDataObserver e comenta esse codigo

/*
        ProdutoDao produtoDao = new ProdutoDao(em);
        produtoDao.adiciona(new Produto("DVD/Blu-ray Justin Bieber", 120.8, 2));
        produtoDao.adiciona(new Produto("Carro de F1", 1.99, 5));
        produtoDao.adiciona(new Produto("Livro da Casa do Código", 29.9, 10));
*/

deu certo amigo, agora qual a Explicação ?, Funcionou mas nao entendi o porque

solução!

O metodo pode ficar assim também. Ai continua criando os 3 produtos

EntityManager em = JPAUtil.criaEntityManager();
        em.getTransaction().begin();

        UsuarioDao usuarioDao = new UsuarioDao(em);
        usuarioDao.salva(new Usuario("vraptor", "vraptor"));

        ProdutoDao produtoDao = new ProdutoDao(em);
        produtoDao.adiciona(new Produto("DVD/Blu-ray Justin Bieber", 120.8, 2));
        produtoDao.adiciona(new Produto("Carro de F1", 1.99, 5));
        produtoDao.adiciona(new Produto("Livro da Casa do Código", 29.9, 10));

        em.getTransaction().commit();
        em.close();

Se ficar diferente disso vai conflitar a criação de transações. Acredito que a explicação fique perto disso.

Modifiquei meu método insert da classe InitialDataObserver e deu certo, ficou assim:

public void insert(@Observes VRaptorInitialized event) {

        EntityManager em = JPAUtil.criaEntityManager();


        UsuarioDao usuarioDao = new UsuarioDao(em);
        usuarioDao.salva(new Usuario("vraptor", "vraptor"));

        ProdutoDao produtoDao = new ProdutoDao(em);
        produtoDao.adiciona(new Produto("DVD/Blu-ray Justin Bieber", 120.8, 2));
        produtoDao.adiciona(new Produto("Carro de F1", 1.99, 5));
        produtoDao.adiciona(new Produto("Livro da Casa do Código", 29.9, 10));


        em.close();
    }

Modifiquei também o método salva da classe UsuarioDao para:

public void salva(Usuario usuario) {
        em.getTransaction().begin();        
        em.persist(usuario);
        em.getTransaction().commit();
    }

Funcionou, espero que esteja certo!

Estava com o mesmo problema do getTransaction, e ambas as soluções funcionaram, valeu!!!!