Re:Problema com LazyInitializationException[RESOLVIDO] =]

1 resposta
maxmustang

Fala Galera, blz?
nao to conseguindo resolver nem entender o pq dessa exception
o erro é o seguinte

30/11/2010 13:20:44 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet action threw exception
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.tecnoarte.drtools.model.usuario.Usuario.privilegios, 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.PersistentSet.iterator(PersistentSet.java:163)
        at br.com.tecnoarte.drtools.controller.wizardcontroledeacesso.DefinirPermissoesAction.processa(DefinirPermissoesAction.java:44)
        at br.com.tecnoarte.drtools.controller.AbstractSecureAction.execute(AbstractSecureAction.java:61)
        at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
        at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
        at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1078)
        at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:396)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:232)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
        at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at br.com.onbudget.hibernate.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:46)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
        at java.lang.Thread.run(Thread.java:619)

minha classe Usuario:

public class Usuario implements Serializable {

    private static int NUM_FALHAS_AUTENTICACAO_PARA_BLOQUEIO = 5;
    private Integer id;
    private String nome;
    private String email, senhaCriptografada, tokenValidacaoEmail;
    private Date dataConfirmacaoEmail;
    @Temporal(TemporalType.DATE)
    private Date dataValidadeSenha;
    private int numFalhasAutenticacao;
    private Set privilegios = new HashSet();
    private Set gruposDePrivilegios = new HashSet();
    private String perfil;
    private Cliente cliente;
    private transient Set todosPrivilegios;
    private Boolean emailValido;

//gets e sets
//metodo que quero utilizar dentro da action do Struts

 public int getPermissaoDeAcesso(Privilegio privilegio) {
        int retorno = -1;
        //verifica se os Privilegios contem o privilegio
            if (privilegios.contains(privilegio)) {
                //percorrer o grupo e comparar com o privilegio passado e devolver o nivel do grupo
                for (Object o : privilegios) {
                    //verifica se o privilegio do grupo engloba o do privilegio passado
                    if (((Privilegio) o).engloba(privilegio)) {
                        retorno = ((Privilegio) o).getNivel();
                        break;
                    }
                }

            } else {
                for (Object grp : gruposDePrivilegios) {
                    for (Object privilegioObj : ((GrupoDePrivilegios) grp).getPrivilegios()) {
                        //verifica se um privilegio engloba o outro
                        if (((Privilegio) privilegioObj).engloba(privilegio)) {
                            int nivelDestePrivilegio = ((Privilegio) privilegioObj).getNivel();
                            if (retorno < nivelDestePrivilegio) {
                                retorno = nivelDestePrivilegio;
                            }
                        }
                    }
                }
            }
        return retorno;

    }

os atributos privilegios e grupoDePrivilegios representam um relacionamento many-to-many com GrupoDePrivilegio e Privilegio em sí
mapeamento Usuario

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class dynamic-insert="true" dynamic-update="true" lazy="false" name="br.com.tecnoarte.drtools.model.usuario.Usuario" optimistic-lock="version" table="TB_USUARIO">
    <id column="usuario_id" name="id" type="integer">
      <generator class="native"/>
    </id>
    <many-to-one column="cliente_id" lazy="false" name="cliente" not-null="true"/>
    <property column="nome" length="40" name="nome" not-null="true" type="string"/>
    <property column="email" length="40" name="email" type="string" unique="true"/>
    <property column="senha" length="20" name="senhaCriptografada" type="string"/>
    <property column="dt_validacao_email" name="dataConfirmacaoEmail" type="timestamp"/>
    <property column="token_validacao_email" length="40" name="tokenValidacaoEmail" type="string"/>
    <property column="dt_validade_senha" name="dataValidadeSenha" type="timestamp"/>
    <property column="perfil" name="perfil" type="string"/>
    <property column="emailValido" name="emailValido" type="boolean"/>
    <set name="privilegios" table="TB_USUARIO_PRIVILEGIO_XREF">
      <key column="usuario_id"/>
      <many-to-many class="br.com.tecnoarte.drtools.model.usuario.Privilegio" column="privilegio_id"/>
    </set>
    <set name="gruposDePrivilegios" table="TB_USUARIO_GRPPRIVILEGIO_XREF">
      <key column="usuario_id" not-null="true"/>
      <many-to-many class="br.com.tecnoarte.drtools.model.usuario.GrupoDePrivilegios" column="grp_privilegio_id"/>
    </set>
  </class>
</hibernate-mapping>

Mapeamento Privilegio

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class lazy="false" mutable="false" name="br.com.tecnoarte.drtools.model.usuario.Privilegio" table="TB_PRIVILEGIO">
    <id column="privilegio_id" name="id" type="integer">
      <generator class="native"/>
    </id>
    <property column="funcionalidade" length="20" name="funcionalidade" type="string"/>
    <property column="nivel" length="2" name="nivel" type="integer"/>
  </class>
</hibernate-mapping>

Mapeamento GrupoDePrivilegio

<hibernate-mapping>
  <class lazy="false" name="br.com.tecnoarte.drtools.model.usuario.GrupoDePrivilegios" table="TB_GRUPO_PRIVILEGIOS">
    <id column="grp_privilegio_id" name="id" type="integer">
      <generator class="native"/>
    </id>
    <property column="nome" length="20" name="nome" type="string" unique="true"/>
    <set lazy="false" name="privilegios" table="TB_GRPPRIVILEGIO_PRIVILEGIO_XREF">
      <key column="grp_privilegio_id" not-null="true"/>
      <many-to-many class="br.com.tecnoarte.drtools.model.usuario.Privilegio" column="privilegio_id" lazy="false"/>
    </set>
  </class>
</hibernate-mapping>

na minha action do struts

o usuario esta chegando
  Usuario user = (Usuario) request.getSession().getAttribute("usuarioEscolhido");
        //lista com todos os privilegios
        hibernateSession.flush();
        for (Object o : user.getPrivilegios()) {
            dForm.setNivelSelected(String.valueOf(user.getPermissaoDeAcesso((Privilegio) o)));
        }
        return mapping.findForward(SUCESSO);
    }

quando ele entra no for… ja da o erro

1 Resposta

maxmustang

resolvido ! =]

Criado 30 de novembro de 2010
Ultima resposta 30 de nov. de 2010
Respostas 1
Participantes 1