Algumas dúvidas referente a: [no session or session was closed e outras mais]

1 resposta
marcelomello

Olá pessoal,

Alguém sabria me responder onde estou errando!?
Pq com certeza estou errando, mas onde!?

Tenho 3 tables: alerta, alertasubgrupo, subgrupo.
Não sei se meu mapemento está correto, caso não esteja, peço o favor de corrigir tbém.

Pra ser sincero tudo isso é só pra fazer um teste com o VRaptor3, pois comecei a me interessar por ele,
e estou bem afim de utilizá-lo em meus projetos.

@Entity
@Table(name = "ALERTA")
public class Alerta implements Serializable {

    private static final long serialVersionUID = 7568788380991674964L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "CD_ALERT")
    private Integer cdAlert;

    @Column(name = "DS_ALERT")
    private String dsAlert;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "alerta", fetch = FetchType.LAZY)
    private List<AlertaSubgrupo> alertaSubgrupo;
//Getters & Setters
@Entity
@Table(name="ALERTA_SUBGRUPO")
public class AlertaSubgrupo implements Serializable {

    private static final long serialVersionUID = 7037865871225887837L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="cd_alert_subgr")
    private Integer cdAlertaSubgrupo;
    
    @JoinColumn(name = "CD_SUBGR", referencedColumnName = "CD_SUBGR")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Subgrupo subgrupo;

    @JoinColumn(name = "CD_ALERT", referencedColumnName = "CD_ALERT")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Alerta alerta;
@Entity
@Table(name="SUBGRUPO")
public class Subgrupo implements Serializable {
    
    private static final long serialVersionUID = -1502114025418728832L;

    @Id
    @Column(name = "CD_SUBGR", nullable = false)
    private Integer cdSubgr;

    @Column(name = "NM_SUBGR")
    private String nmSubgr;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "subgrupo", fetch = FetchType.LAZY)
    private List<AlertaSubgrupo> alertaSubgrupo;

minha view inicial (apenas para teste) apresenta dois links

  • um para o form: href="alertas/form"
  • um para uma lista: href="alertas/lista"
  • Qdo clico na lista, apresenta a seguinte lista:
    CD       DS Assunto       DS Alerta
    [color=blue]1[/color]       Alerta 001       Alerta 001
    [color=blue]2[/color]       Alerta 002       Alerta 002
    [color=blue]3[/color]       Alerta 003       Alerta 003

    Qdo eu clico no numero 1 por exemplo, ele deve ir para o método mostrado abaixo, e depois passar para a lógica do form.
    Uma vez que quero alterar este item número 1. Sendo assim eu estaria buscando no banco o objeto de código 1.
    Este objeto por sua vez possui uma lista de alertaSubgrupo, que como mostra a exceção, está retornando NULL.
    já que está ocorrendo o seguinte erro:

    >Exception occurred in target VM: failed to lazily initialize a collection of role: br.com.mello.nomeapp.model.Alerta.alertaSubgrupo, [color=red]no session or session was closed [/color]
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.mello.nomeapp.model.Alerta.alertaSubgrupo, no session or session was closed

    [color=red]Favor ler os comentários dentro do código[/color]

    @Get
        @Path("/alertas/id/{alerta.cdAlert}")
        public void findById(Alerta alerta){
    //Outras DUVIDAS:
    //Aqui eu busco de banco, o objeto Alerta vem carregado porém com sua Lista (alertaSubgrupo) com valor null
            alerta = alertaDao.findById(alerta.getCdAlert());
    //aqui eu penso que estaria jogando para o request (setAttribute) o objeto q veio do banco
            result.include("alerta", alerta);
    //Aqui eu quero q ele  para a lógica do form
            result.use(Results.logic()).redirectTo(AlertasController.class).form();
        }
    

    Na lógica do form como eu recupero o objeto alerta já que incluí ele no result??
    Pergunto isso pois não quero fazer um:

    e si um :

    Apenas para teste essa lógica do form está assim:

    @Path("/alertas/form")
        public AlertaFormDto form() {
            alertaFormDto.setAlerta(alertaDao.findById(new Integer(1)));
            alertaFormDto.setSubgrupo(subgrupoDao.findAll());
            return alertaFormDto;
        }
    

    Sei que coloquei a anotação (LAZY) na classe Alerta :

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "alerta", fetch = FetchType.LAZY)
        private List<AlertaSubgrupo> alertaSubgrupo;
    

    Pois quero que apresente somente os dados referente a Alerta (Quando acesso a lista) e não seus subgrupos associados.
    Porém qdo vou para a VIEW do Form, preciso ter um lista de Subgrupos (isto ele traz sem problemas), mas tbém preciso
    que o objeto Alerta, tenha a lista de alertaSubgrupo para que eu possa fazr um forEach e para marcar como [color=#CC0000]selected[/color]
    os que são iguais com a lista de subgrupos.

    mas aí vem o erro q não existe mais sessão com o banco.

    A título de curiosidade estou utilizando o vraptor-3.0.2, spring-2.5.5, hibernate-3.2.6.
    Porém utilizando o HibernateDaoSuport, como mostra as classes abaixo:

    public class GenericDaoImpl<T> extends HibernateDaoSupport implements
            IGenericDao<T> {
    
        private static final Log log = LogFactory.getLog(GenericDaoImpl.class);
        private Class<T> clazz;
    
        /**
         * @param clazz
         */
        public GenericDaoImpl(Class<T> clazz, SessionFactory factory) {
            this.clazz = clazz;
            setSessionFactory(factory);
            setHibernateTemplate(new HibernateTemplate(factory));
        }
    

    Aqui está os Daos específicos:

    @Component
    public class AlertaDaoImpl extends GenericDaoImpl<Alerta> implements IAlertaDao<Alerta>{
    
        public AlertaDaoImpl(SessionFactory factory) {
            super(Alerta.class, factory);
        }
    }
    
    
    @Component
    public class AlertaSubgrupoDaoImpl extends GenericDaoImpl<AlertaSubgrupo> implements IAlertaSubgrupoDao<AlertaSubgrupo>{
    
        public AlertaSubgrupoDaoImpl(SessionFactory factory) {
            super(AlertaSubgrupo.class, factory);
        }
    }
    
    
    @Component
    public class SubgrupoDaoImpl extends GenericDaoImpl<Subgrupo> implements ISubgrupoDao<Subgrupo>{
    
        public SubgrupoDaoImpl(SessionFactory factory) {
            super(Subgrupo.class, factory);
        }
    }
    

    Só mais essa pergunta:

    Percebi que foi lançada uma versão vraptor-3.1.0.zip e gostaria de saber pq que na pasta lib/mandatory do projeto não
    encontra-se o arquivo ( org.springframework.orm-3.0.0.RELEASE.jar )?! não há necessidade dele para trabalhar com hibernate?!

    A exception geral está abaixo do meu problema com a [color=red]no session or session was closed [/color]

    StandardWrapperValve[default]: PWC1406: Servlet.service() for servlet default threw exception
    
    br.com.caelum.vraptor.view.ResultException: org.apache.jasper.JasperException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.mello.nomeapp.model.Alerta.alertaSubgrupo, no session or session was closed
    
    at br.com.caelum.vraptor.view.DefaultPageResult.forward(DefaultPageResult.java:74)
    
    at br.com.caelum.vraptor.extra.ForwardToDefaultViewInterceptor.intercept(ForwardToDefaultViewInterceptor.java:49)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.interceptor.OutjectResult.intercept(OutjectResult.java:56)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:66)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:72)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
    
    at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
    
    at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
    
    at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
    
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
    
    at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
    
    at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
    
    at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
    
    at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
    
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246)
    
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313)
    
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)
    
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
    
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
    
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
    
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
    
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
    
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
    
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
    
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
    
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
    
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
    
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)
    
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
    
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
    
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
    
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
    
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288)
    
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647)
    
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579)
    
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)
    
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
    
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
    
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
    
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
    
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
    
    Caused by: org.apache.jasper.JasperException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.mello.nomeapp.model.Alerta.alertaSubgrupo, no session or session was closed
    
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:418)
    
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486)
    
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380)
    
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)
    
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333)
    
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    
    at br.com.caelum.vraptor.core.DefaultStaticContentHandler.deferProcessingToContainer(DefaultStaticContentHandler.java:72)
    
    at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:80)
    
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246)
    
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    
    at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:873)
    
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:723)
    
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:558)
    
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:490)
    
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:382)
    
    at br.com.caelum.vraptor.view.DefaultPageResult.forward(DefaultPageResult.java:72)
    
     65 more
    
    Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.mello.nomeapp.model.Alerta.alertaSubgrupo, no session or session was closed
    
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
    
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
    
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
    
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
    
    at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:249)
    
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:382)
    
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:258)
    
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:189)
    
    at javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:287)
    
    at org.apache.jsp.WEB_002dINF.jsp.alertas.form_jsp._jspx_meth_c_forEach_2(form_jsp.java from :268)
    
    at org.apache.jsp.WEB_002dINF.jsp.alertas.form_jsp._jspx_meth_c_forEach_1(form_jsp.java from :233)
    
    at org.apache.jsp.WEB_002dINF.jsp.alertas.form_jsp._jspService(form_jsp.java from :113)
    
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109)
    
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:389)
    
     81 more
    

    1 Resposta

    Lucas_Cavalcanti

    é isso mesmo que vc quer? redirecionar pra lógica do form?
    talvez vc deva trocar pra

    desse jeito vai funcionar, não vai dar lazyInitalization.

    como vc não recebe nada no método form, vc não pode fazer isso… o melhor seria fazer algo do tipo:

    public void form() {
       //nada, ou adicionar alguns valores padrão, pra preencher comboboxes por exemplo
    }
    public void visualiza(Alerta alerta) {
         //...
         alertaFormDto.setAlerta(alerta);
         result.include("aletraFormDto", alertaFormDto); 
         result.of(this).form(); // só funciona no vraptor 3.1.0
    }
    

    e na hora de redirecionar, use o método visualiza… só cuidado com o lazy initialization, vai acontecer sempre que vc fizer um redirect (e não um forward)… pra prevenir isso faça um dao.load(alerta) no método visualiza.

    Vc pode usar o ORM do Spring se quiser (assim como qqer componente)… mas não é padrão do VRaptor, por isso esse jar não vem junto…
    O jeito “padrão” de usar o Hibernate com o VRaptor é usar o HibernateProvider, e receber uma Session no construtor dos seus daos…
    mais info em: http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/

    []'s

    Criado 14 de janeiro de 2010
    Ultima resposta 14 de jan. de 2010
    Respostas 1
    Participantes 2