Problema com org.hibernate.LazyInitializationException

4 respostas
T

Bom dia galera!

É o seguinte:

Tenho essas duas classes de entidade:
@Entity
public class TbSolucionador  implements java.io.Serializable, Comparable<TbSolucionador> {

    private Long id;
    private TbDepartamento tbDepartamento;
    private String nmLogin;
    private String nmSolucionador;
    private String flAtivo;
    private Set<TbPendencia> tbPendencias = new HashSet<TbPendencia>(0);
    private Set<TbFilial> tbFilials = new HashSet<TbFilial>(0);

    // Ocultado os construtores para melhor visualização da classe
   
    @Id
    @GeneratedValue
    @Column(name="ID", unique=true, nullable=false, precision=22, scale=0)
    public Long getId() {
        return this.id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="ID_DEPARTAMENTO", nullable=false)
    public TbDepartamento getTbDepartamento() {
        return this.tbDepartamento;
    }
    
    public void setTbDepartamento(TbDepartamento tbDepartamento) {
        this.tbDepartamento = tbDepartamento;
    }
    
    @Column(name="NM_LOGIN", nullable=false, length=20)
    public String getNmLogin() {
        return this.nmLogin;
    }
    
    public void setNmLogin(String nmLogin) {
        this.nmLogin = nmLogin;
    }
    
    @Column(name="NM_SOLUCIONADOR", nullable=false, length=60)
    public String getNmSolucionador() {
        return this.nmSolucionador;
    }
    
    public void setNmSolucionador(String nmSolucionador) {
        this.nmSolucionador = nmSolucionador;
    }
    
    @Column(name="FL_ATIVO", nullable=false, length=1)
    public String getFlAtivo() {
        return this.flAtivo;
    }
    
    public void setFlAtivo(String flAtivo) {
        this.flAtivo = flAtivo;
    }

    @OneToMany(fetch=FetchType.EAGER, mappedBy="tbSolucionador")
    public Set<TbPendencia> getTbPendencias() {
        return this.tbPendencias;
    }
    
    public void setTbPendencias(Set<TbPendencia> tbPendencias) {
        this.tbPendencias = tbPendencias;
    }

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(name="TB_SOLUCIONADOR_FILIAL",
    	joinColumns = { @JoinColumn(name="ID_SOLUCIONADOR", nullable=false, updatable=false) },
    	inverseJoinColumns = { @JoinColumn(name="ID_FILIAL", nullable=false, updatable=false) })
    public Set<TbFilial> getTbFilials() {
        return this.tbFilials;
    }
    
    public void setTbFilials(Set<TbFilial> tbFilials) {
        this.tbFilials = tbFilials;
    }

	@Override
	public int compareTo(TbSolucionador tbSolucionador) {
		if (this.getId() < tbSolucionador.getId())
			return -1;
		else if (this.getId() > tbSolucionador.getId())
			return 1;
		else
			return 0;
	}

}
@Entity
public class TbFilial  implements java.io.Serializable {

	private int idFilial;
    private String fantasia;
    private String endereco;
    private String bairro;
    private String cidade;
    private String uf;
    private String telefone;
    private Set<TbMetaFilial> tbMetaFilials = new HashSet<TbMetaFilial>(0);
    private Set<TbPendencia> tbPendencias = new HashSet<TbPendencia>(0);
    private Set<TbSolucionador> tbSolucionadors = new HashSet<TbSolucionador>(0);

    // Ocultado os construtores para melhor visualização da classe
   
    @Id 
    @Column(name="ID_FILIAL", unique=true, nullable=false, precision=4, scale=0)
    public int getIdFilial() {
        return this.idFilial;
    }
    
    public void setIdFilial(int idFilial) {
        this.idFilial = idFilial;
    }

    @OneToMany(fetch=FetchType.EAGER, mappedBy="tbFilial")
    public Set<TbMetaFilial> getTbMetaFilials() {
        return this.tbMetaFilials;
    }
    
    public void setTbMetaFilials(Set<TbMetaFilial> tbMetaFilials) {
        this.tbMetaFilials = tbMetaFilials;
    }

    @OneToMany(fetch=FetchType.EAGER, mappedBy="tbFilial")
    public Set<TbPendencia> getTbPendencias() {
        return this.tbPendencias;
    }
    
    public void setTbPendencias(Set<TbPendencia> tbPendencias) {
        this.tbPendencias = tbPendencias;
    }

    @Column(name = "FANTASIA", nullable = false, length = 10)
	public String getFantasia() {
		return fantasia;
	}

	public void setFantasia(String fantasia) {
		this.fantasia = fantasia;
	}

	@Column(name = "ENDERECO", nullable = false, length = 72)
	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	@Column(name = "BAIRRO", nullable = false, length = 72)
	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	@Column(name = "CIDADE", nullable = false, length = 72)
	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	@Column(name = "UF", nullable = false, length = 2)
	public String getUf() {
		return uf;
	}

	public void setUf(String uf) {
		this.uf = uf;
	}

	@Column(name = "TELEFONE", nullable = false, length = 12)
	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	
	@ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(name="TB_SOLUCIONADOR_FILIAL",
    	joinColumns = { @JoinColumn(name="ID_FILIAL", nullable=false, updatable=false) },
    	inverseJoinColumns = { @JoinColumn(name="ID_SOLUCIONADOR", nullable=false, updatable=false) })
    public Set<TbSolucionador> getTbSolucionadors() {
        return this.tbSolucionadors;
    }
    
    public void setTbSolucionadors(Set<TbSolucionador> tbSolucionadors) {
        this.tbSolucionadors = tbSolucionadors;
    }
	
	@Override
	public boolean equals(Object obj) {
		if (obj == null) return false;
		if (this == obj) return true;
		if (!(obj instanceof TbFilial)) return false;
		
		TbFilial f = (TbFilial)obj;
		
		return this.getIdFilial() == f.getIdFilial();
	}

}
E a seguinte tela:
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
				xmlns:f="http://java.sun.com/jsf/core"
				xmlns:p="http://primefaces.org/ui" 
				xmlns:h="http://java.sun.com/jsf/html"
				xmlns:ui="http://java.sun.com/jsf/facelets" 
				template="/template/main.xhtml">

	<ui:define name="body">
		<f:event listener="#{tbSolucionadorEditMB.isPermitted}" type="preRenderView" />
		<h:form prependId="false">
		
			<p:toolbar>
				<p:toolbarGroup align="left">					
					<p:commandButton value="#{messages['button.save']}" action="#{tbSolucionadorEditMB.update}"
						rendered="#{tbSolucionadorEditMB.updateMode}" ajax="false" />
					<p:commandButton value="#{messages['button.back']}" action="#{tbSolucionadorEditMB.previousView}" immediate="true" ajax="false"/>
					
				</p:toolbarGroup>
			</p:toolbar>

			<br />

			<p:fieldset legend="#{messages['tbSolucionador.label']}" toggleable="false" toggleSpeed="500">
				<h:panelGrid id="fields" columns="3">
					
					<h:outputLabel value="#{messages['tbSolucionador.label.tbDepartamento']} * " for="tbDepartamento" styleClass="text-input" />
					<p:selectOneMenu id="tbDepartamento" value="#{tbSolucionadorEditMB.bean.tbDepartamento}" converter="departamentoConverter">
						<f:selectItems value="#{tbSolucionadorEditMB.departamentoItems}"/>
					</p:selectOneMenu>
					<p:message for="tbDepartamento" />
					
					<h:outputLabel value="#{messages['tbSolucionador.label.nmLogin']} * " for="nmLogin" styleClass="text-input" />
					<p:inputText id="nmLogin" value="#{tbSolucionadorEditMB.bean.nmLogin}" title="#{messages['tbSolucionador.alt.nmLogin']}" maxlength="15"
								validator="#{tbSolucionadorEditMB.validarEspacoBranco}" required="true" requiredMessage="#{messages['mensagem.campo.null']}"/>
					<p:message for="nmLogin"   />
					
					<h:outputLabel value="#{messages['tbSolucionador.label.nmSolucionador']} * " for="nmSolucionador" styleClass="text-input" />
					<p:inputText id="nmSolucionador" value="#{tbSolucionadorEditMB.bean.nmSolucionador}" title="#{messages['tbSolucionador.alt.nmSolucionador']}" 
					             validator="#{tbSolucionadorEditMB.validarEspacoBranco}" maxlength="60"
					             required="true" requiredMessage="#{messages['mensagem.campo.null']}"/>
					<p:message for="nmSolucionador" />
					
					<h:outputLabel value="#{messages['tbSolucionador.label.flAtivo']} * " for="flAtivo" styleClass="text-input" />
					<p:selectOneMenu id="flAtivo" value="#{tbSolucionadorEditMB.bean.flAtivo}">
						<f:selectItem itemLabel="Sim" itemValue="S"/>
						<f:selectItem itemLabel="Não" itemValue="N"/>
					</p:selectOneMenu>
					<p:message for="flAtivo" />
					
					<h:outputLabel value="#{messages['tbSolucionador.label.idFilial']} * " for="idFilial" styleClass="text-input" />
					<p:selectManyMenu id="idFilial" value="#{tbSolucionadorEditMB.bean.tbFilials}" converter="filialConverterSol" style="width:150px;height:200px">
						<f:selectItems value="#{tbSolucionadorEditMB.filiais}" var="filial" itemLabel="#{filial.fantasia}" itemValue="#{filial}"/>
					</p:selectManyMenu>
					<p:message for="idFilial" />
					
				</h:panelGrid>
			</p:fieldset>
		</h:form>
	</ui:define>
</ui:composition>
Quando modifico qualquer campo e tento atualizar ele lança a exceção: [color=red]org.hibernate.LazyInitializationException[/color].

Esse erro ocorre justamente na renderização do [color=blue][/color] quando clico no botão de atualizar. Só que o relacionamento ao qual esse componente refere-se está como eager. O que pode está acontecendo?

Agradeço desde já pela ajuda.

Até mais.

4 Respostas

Hebert_Coelho

Quatro soluções para LazyInitializationException [=

T

Legal Hebert, mas já estou usando umas das estratégias desse artigo, que é utilizar o Fetch Strategy Eager. Porém nada adiantou.

Estou tentando usar Open Session In View, mas uso o Framework Demoiselle e estou apanhando muito pra fazer.

Você já usou o Open Session In View no Demoiselle Hebert?

Hebert_Coelho

Thyaggo:
Legal Hebert, mas já estou usando umas das estratégias desse artigo, que é utilizar o Fetch Strategy Eager. Porém nada adiantou.

Estou tentando usar Open Session In View, mas uso o Framework Demoiselle e estou apanhando muito pra fazer.

Você já usou o Open Session In View no Demoiselle Hebert?

Não, nunca.

T

kkkkkkkk… Blz! Valeu pela dica do artigo do rapaz.

Criado 17 de maio de 2013
Ultima resposta 20 de mai. de 2013
Respostas 4
Participantes 2