LazyInitializationException: failed to lazily initialize a collection of role: no session or session was closed

Sou estagiário e possuo um conhecimento básio em JSP, estou tentando colocar o projeto https://github.com/culturagovbr/GOG para rodar. Me deparei com erros como o exposto abaixo em 3 páginas, tentei todas as soluções que encontrei na internet, mas não consegui aplicar as soluções corretamente.

O erro:

The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: failed to lazily initialize a collection of role: br.com.xti.ouvidoria.model.TbUnidade.tbClassificacaoCollection, no session or session was closed
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
br.com.xti.ouvidoria.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:22)

root cause

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.xti.ouvidoria.model.TbUnidade.tbClassificacaoCollection, no session or session was closed
	org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:393)
	org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:385)
	org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:125)
	org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:242)
	javax.faces.model.ListDataModel.isRowAvailable(ListDataModel.java:110)
	javax.faces.model.ListDataModel.setRowIndex(ListDataModel.java:185)
	javax.faces.model.ListDataModel.setWrappedData(ListDataModel.java:220)
	javax.faces.model.ListDataModel.<init>(ListDataModel.java:79)
	com.sun.faces.facelets.component.UIRepeat.getDataModel(UIRepeat.java:257)
	com.sun.faces.facelets.component.UIRepeat.setIndex(UIRepeat.java:443)
	com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:482)
	com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:984)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
	org.primefaces.component.datatable.DataTableRenderer.encodeCell(DataTableRenderer.java:823)
	org.primefaces.component.datatable.DataTableRenderer.encodeRow(DataTableRenderer.java:784)
	org.primefaces.component.datatable.DataTableRenderer.encodeRows(DataTableRenderer.java:699)
	org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:654)
	org.primefaces.component.datatable.DataTableRenderer.encodeRegularTable(DataTableRenderer.java:249)
	org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:211)
	org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:83)
	javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:70)
	org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:57)
	org.primefaces.component.fieldset.FieldsetRenderer.encodeContent(FieldsetRenderer.java:94)
	org.primefaces.component.fieldset.FieldsetRenderer.encodeMarkup(FieldsetRenderer.java:76)
	org.primefaces.component.fieldset.FieldsetRenderer.encodeEnd(FieldsetRenderer.java:47)
	javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
	com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
	com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
	javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
	org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
	br.com.xti.ouvidoria.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:22)

O arquivo principal.xhtml do manterunidade

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="../templates/template.xhtml"
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">
	
    <ui:define name="bread">
        <h:form>
            <p:breadCrumb>  
                <p:menuitem value="Home"/>  
                <p:menuitem value="Cadastro de Unidade"/>  
            </p:breadCrumb>  
        </h:form>
    </ui:define>
    
    <ui:define name="content">
        <p:fieldset legend="Cadastro de Unidade" style="max-width: 1190px; margin: 0 auto">
            <h:form id="formUnidades">
                <p:dataTable id="tabela1" 
                             widgetVar="tabela"
                             value="#{mBUnidade.todos}"
                             paginator="true" rows="5"
                             rowsPerPageTemplate="5,10,15"
                             paginatorPosition="bottom"
                             paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                             var="item"
                             rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}" rowIndexVar="rowIx">
                    <f:facet name="header">                    
                        <p:commandButton id="cbNovo" 
                                         type="button"
                                         value="Novo"
                                         onclick="dlgNovoUnidade.show();" 
                                         style="float: left"/>
                    </f:facet>
                    <p:column filterBy="#{item.nmUnidade}" filterMatchMode="contains" sortBy="#{item.nmUnidade}">
                        <f:facet name="header">
                            <h:outputText value="Nome da Unidade"/>
                        </f:facet>
                        <h:outputText value="#{item.nmUnidade}"/>
                    </p:column>
                    <p:column filterBy="#{item.sgUnidade}" filterMatchMode="contains" sortBy="#{item.sgUnidade}">
                        <f:facet name="header">
                            <h:outputText value="Sigla da Unidade"/>
                        </f:facet>
                        <h:outputText value="#{item.sgUnidade}"/>
                    </p:column>
                    <p:column >
                        <f:facet name="header">
                            <h:outputText value="Classificações"/>
                        </f:facet>
                        <ui:repeat value="#{item.tbClassificacaoCollection}" var="c">
                            <li>#{c.dsClassificacao}</li>
                        </ui:repeat>
                    </p:column>
                    <p:column filterBy="#{item.eeEmail}" filterMatchMode="contains" sortBy="#{item.eeEmail}">
                        <f:facet name="header">
                            <h:outputText value="E-mail"/>
                        </f:facet>
                        <h:outputText value="#{item.eeEmail}"/>
                    </p:column>

                    <p:column style="width: 80px">
                        <f:facet name="header">
                            <h:outputText value="Editar"/>
                        </f:facet>
                        <p:commandButton id="cbViewEditar" 
                                         icon="ui-icon-pencil"
                                         title="Editar"
                                         update=":frmEditarUnidades"
                                         oncomplete="dlgEditarUnidade.show();"
                                         >
                            <f:setPropertyActionListener value="#{item}" target="#{mBUnidade.unidade}" />
                        </p:commandButton>
                    </p:column>
                    <p:column style="width: 40px">
                        <f:facet name="header">
                            <h:outputLabel value="Excluir"/>
                        </f:facet>
                        <p:commandButton icon="ui-icon-close" onclick="dlgNaoPodeExcluir.show();" 
                        				 rendered="#{not mBUnidade.mostrarBotaoExcluir(item) and item.idUnidade != 1}" />
                        <p:commandButton id="cbViewExcluir" onclick="dlgExcluirUnidade.show();"
                                         icon="ui-icon-close" title="Excluir"
                                         rendered="#{mBUnidade.mostrarBotaoExcluir(item)}">
                            <f:setPropertyActionListener value="#{item}" target="#{mBUnidade.unidade}" />
                        </p:commandButton>
                    </p:column>
                </p:dataTable>
            </h:form>
            <!-- Caixa de diálogo de exclusão -->
            <p:confirmDialog id="dialogoExcluirUnidades" message="Confirmar Operação?"
                             header="Excluir Unidade" severity="alert"
                             widgetVar="dlgExcluirUnidade" appendToBody="true" closable="true" width="300">
                <h:form id="frmExcluirUnidades">
                    <p:panelGrid style="width: 100%">
                        <p:row>
                            <p:column style="text-align: center; width: 100%" styleClass="ui-widget-header">
                                <p:commandButton id="cbExcluirContinuar" value="Sim"
                                                 update=":formUnidades"
                                                 oncomplete="dlgExcluirUnidade.hide();tabela.filter()"
                                                 actionListener="#{mBUnidade.remover}"/>
                                <p:commandButton id="cbExcluirCancelar" value="Não" onclick="dlgExcluirUnidade.hide()" type="button" />                    
                            </p:column>
                        </p:row>
                    </p:panelGrid>
                </h:form>
            </p:confirmDialog>
            <!-- Caixa de diálogo de inclusão -->
            <p:dialog id="dialogoNovoUnidades" widgetVar="dlgNovoUnidade" modal="true" header="Nova Unidade"
                      resizable="false" appendToBody="true" closable="true">
                <h:form id="frmNovoUnidades">
                    <p:messages id="mNovoMessages" redisplay="false" />
                    <p:panelGrid columns="2" style="width: 100%">
                        <h:outputLabel value="Nome da Unidade:* " />
                        <p:inputText value="#{mBUnidade.unidadeNovo.nmUnidade}" required="true" requiredMessage="Digite a Nome da Unidade" title="Informe o Nome da Unidade " size="50" />
                        
                        <h:outputLabel value="Sigla da Unidade:* " />
                        <p:inputText value="#{mBUnidade.unidadeNovo.sgUnidade}" required="true" requiredMessage="Digite a Sigla da Unidade" title="Informe a Sigla da Unidade " size="50" />
                        
                        <h:outputLabel value="E-mail da Unidade:* " />
                        <p:inputText value="#{mBUnidade.unidadeNovo.eeEmail}" required="true" requiredMessage="Digite o E-mail da Unidade" title="Informe o E-mail da Unidade " size="50">
                            <f:validator binding="#{emailValidator}" />
                        </p:inputText>
                        
                        <h:outputText value="Permitir qualquer interlocutor realizar encaminhamento para outras unidades"/>
                        <p:selectBooleanCheckbox value="#{mBUnidade.unidadeNovo.encaminharOutrasAreas}" />
                        
                        <h:outputText value="Permitir qualquer analista RETORNAR trâmite para Ouvidoria"/>
                        <p:selectBooleanCheckbox value="#{mBUnidade.unidadeNovo.retornoOuvidoria}" />
                        
                        <h:outputText value="Unidade Vinculada?"/>
                        <p:selectBooleanCheckbox value="#{mBUnidade.unidadeNovo.vinculada}" />
                    </p:panelGrid>
                    <p:panelGrid style="width: 100%">
                        <p:row>
                            <p:column style="text-align: center; width: 100%" styleClass="ui-widget-header">
                                <p:commandButton id="cbNovoSalvar" value="Salvar"
                                                 actionListener="#{mBUnidade.cadastrar}"
                                                 oncomplete="if (!args.validationFailed){dlgNovoUnidade.hide()}"
                                                 update=":formUnidades,frmNovoUnidades"
                                                 ajax="true">
                                    <p:resetInput target="frmNovoUnidades" />
                                </p:commandButton>
                                <p:spacer width="20px"/>
                                <p:commandButton value="Fechar" immediate="true" update="frmNovoUnidades" onclick="dlgNovoUnidade.hide()">
                                    <p:resetInput target="frmNovoUnidades" />
                                </p:commandButton>
                            </p:column>
                        </p:row>
                    </p:panelGrid>
                </h:form>
            </p:dialog>
            <!-- Caixa de diálogo de edição -->
            <p:dialog id="dialogoEditarUnidades" widgetVar="dlgEditarUnidade" header="Editar Unidade"
                      resizable="false" modal="true" appendToBody="true" closable="true">
                <h:form id="frmEditarUnidades">
                    <p:messages id="mEditarMessages" redisplay="false" />
                    <p:panelGrid columns="2" style="width: 100%">
                        <h:outputLabel value="Nome da Unidade:* " />
                        <p:inputText value="#{mBUnidade.unidade.nmUnidade}" required="true" requiredMessage="Digite o Nome da Undidade" title="Informe o Nome da Undidade " size="45" disabled="#{mBUnidade.unidade.idUnidade == 1}"/>
                        
                        <h:outputLabel value="Sigla da Unidade:* " />
                        <p:inputText value="#{mBUnidade.unidade.sgUnidade}" required="true" requiredMessage="Digite Sigla da Unidade" title="Informe a Sigla da Unidade " size="45" disabled="#{mBUnidade.unidade.idUnidade == 1}"/>
                        
                        <h:outputLabel value="E-mail da Unidade:* " />
                        <p:inputText value="#{mBUnidade.unidade.eeEmail}" size="50" required="true" requiredMessage="Digite o E-mail da Unidade" title="Informe o E-mail da Unidade " >
                            <f:validator binding="#{emailValidator}" />
                        </p:inputText>
                        
                        <h:outputText value="Permitir qualquer interlocutor realizar encaminhamento para outras unidades"/>
                        <p:selectBooleanCheckbox value="#{mBUnidade.unidade.encaminharOutrasAreas}" />
                        
                        <h:outputText value="Permitir qualquer analista RETORNAR trâmite para Ouvidoria"/>
                        <p:selectBooleanCheckbox value="#{mBUnidade.unidade.retornoOuvidoria}" />
                        
                        <h:outputText value="Unidade Vinculada?"/>
                        <p:selectBooleanCheckbox value="#{mBUnidade.unidade.vinculada}" />
                    </p:panelGrid>
                    <p:panelGrid style="width: 100%">
                        <p:row>
                            <p:column style="text-align: center; width: 100%" styleClass="ui-widget-header">
                                <p:commandButton id="cbEditarSalvar" value="Salvar"
                                                 actionListener="#{mBUnidade.alterar}"
                                                 oncomplete="if (!args.validationFailed){dlgEditarUnidade.hide()}"
                                                 update=":formUnidades,frmEditarUnidades">
                                    <p:resetInput target="frmEditarUnidades" />
                                </p:commandButton>
                                <p:spacer width="20px"/>
                                <p:commandButton value="Fechar" immediate="true" update="frmEditarUnidades" onclick="dlgEditarUnidade.hide()">
                                    <p:resetInput target="frmEditarUnidades" />
                                </p:commandButton>
                            </p:column>
                        </p:row>
                    </p:panelGrid>
                </h:form>
            </p:dialog>
            
            <!-- Caixa de diálogo Não pode excluir -->
            <p:confirmDialog id="dialogoNaoPodeExcluir" 
							 message="Esta unidade não pode ser deletada pois existem encaminhamentos realizados para ela."
                             header="Excluir Unidade" severity="alert"
                             widgetVar="dlgNaoPodeExcluir" appendToBody="true" closable="true" width="315">
				<p:panelGrid style="width: 100%">
					<p:row>
						<p:column style="text-align: center; width: 100%" styleClass="ui-widget-header">
							<p:commandButton id="cbExcluirCancelar" value="Fechar" onclick="dlgNaoPodeExcluir.hide()" type="button" />                    
						</p:column>
					</p:row>
				</p:panelGrid>
            </p:confirmDialog>
        </p:fieldset>
    </ui:define>
</ui:composition>

O UnidadeDAO.java

package br.com.xti.ouvidoria.dao;

import java.util.Collection;
import java.util.HashMap;

import javax.ejb.Stateless;

import br.com.xti.ouvidoria.model.TbManifestacao;
import br.com.xti.ouvidoria.model.TbUnidade;

/**
 * @author renato
 */
@Stateless
public class UnidadeDAO extends AbstractDAO<TbUnidade> {
    public UnidadeDAO() {
        super(TbUnidade.class);
    }
    
      @Override
    public String getNomeEntidade() {
        return "Unidade";
    }
      
       public Collection<TbUnidade> getPorEncaminhamentoManifestacao(TbManifestacao idManifestacao) {
        Collection<TbUnidade> retorno = null;
        try {
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("idManifestacao", idManifestacao);
            retorno = selectList("SELECT t.idUnidadeRecebeu FROM TbEncaminhamento t WHERE t.idManifestacao = :idManifestacao", map);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return retorno;
    }
}

O controller MBUnidade.java:

package br.com.xti.ouvidoria.controller;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import org.hibernate.Hibernate;

import br.com.xti.ouvidoria.dao.ClassificacaoDAO;
import br.com.xti.ouvidoria.dao.UnidadeDAO;
import br.com.xti.ouvidoria.helper.ValidacaoHelper;
import br.com.xti.ouvidoria.model.TbUnidade;
import br.com.xti.ouvidoria.model.enums.UnidadeEnum;

/**
 * @author renato
 */
@SuppressWarnings("serial")
@ManagedBean(name = "mBUnidade")
@ViewScoped
public class MBUnidade implements Serializable {

    @EJB
    private UnidadeDAO dao;
    
    @EJB
    private ClassificacaoDAO classificacaoDAO;
    
    private TbUnidade unidade = new TbUnidade();
    private TbUnidade unidadeNovo = new TbUnidade();
    
    public List<TbUnidade> getTodos() {
    	Hibernate.initialize(dao);
    	List<TbUnidade> list = dao.findAll();
    	Collections.sort(list);
        return list;
    }

    public void cadastrar(ActionEvent actionEvent) {
        try {
            getDao().create(getUnidadeNovo());
            MensagemFaceUtil.info("Inclusão realizada com sucesso.", "");
        } catch (Exception e) {
            if (e.getMessage().contains("UNIQUE")) {
                MensagemFaceUtil.erro("Erro", "Já existe uma unidade com este nome ou sigla");
            } else {
                MensagemFaceUtil.erro("Erro", "Ocorreu um erro. Entre em contato com o administrador do sistema.");
            }
        }
        limpar();
    }

    public void alterar(ActionEvent actionEvent) {
        try {
            if (getUnidade() != null && getUnidade().getIdUnidade() != null) {
                getDao().edit(getUnidade());
                MensagemFaceUtil.info("Alteração realizada com sucesso.", "");
            }
        } catch (Exception e) {
            if (e.getMessage().contains("UNIQUE")) {
                MensagemFaceUtil.erro("Erro", "Já existe uma unidade com este nome ou sigla");
            } else {
                MensagemFaceUtil.erro("Erro", "Ocorreu um erro. Entre em contato com o administrador do sistema.");
            }
        }
        limpar();
    }

    public void remover(ActionEvent actionEvent) {
        try {
            if (getUnidade() != null && getUnidade().getIdUnidade() != null) {
                getDao().remove(getUnidade());
                MensagemFaceUtil.info("Exclusão realizada com sucesso.", "");
            }
        } catch (Exception e) {
            e.printStackTrace();
            MensagemFaceUtil.erro("Erro", "Ocorreu um erro. Entre em contato com o administrador do sistema.");
        }
        limpar();
    }
    
    public boolean mostrarBotaoExcluir(TbUnidade u) {
    	if(u.getIdUnidade() == UnidadeEnum.OUVIDORIA.getId()) {
    		return false;
    	}
    	
    	if(ValidacaoHelper.isNotEmpty(u.getTbEncaminhamentoCollection().size())) {
    		return false;
    	}
    	
    	return true;
    }

    private void limpar() {
        unidade = new TbUnidade();
        unidadeNovo = new TbUnidade();
    }
    
    public UnidadeDAO getDao() {
        return dao;
    }

    public TbUnidade getUnidade() {
        return unidade;
    }

    public void setUnidade(TbUnidade unidade) {
        this.unidade = unidade;
    }

    public TbUnidade getUnidadeNovo() {
        return unidadeNovo;
    }

    public void setUnidadeNovo(TbUnidade unidadeNovo) {
        this.unidadeNovo = unidadeNovo;
    }
    
}

O model TbUnidade.java:

package br.com.xti.ouvidoria.model;

import static br.com.xti.ouvidoria.model.enums.BooleanEnum.NAO;
import static br.com.xti.ouvidoria.model.enums.BooleanEnum.SIM;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import br.com.xti.ouvidoria.model.enums.UnidadeEnum;

/**
 * @author samuel.guimaraes
 */
@Entity
@Table(name = "tbUnidade")
@NamedQueries({
    @NamedQuery(name = "TbUnidade.findAll", query = "SELECT t FROM TbUnidade t"),
    @NamedQuery(name = "TbUnidade.findByIdUnidade", query = "SELECT t FROM TbUnidade t WHERE t.idUnidade = :idUnidade"),
    @NamedQuery(name = "TbUnidade.findByNmUnidade", query = "SELECT t FROM TbUnidade t WHERE t.nmUnidade = :nmUnidade"),
    @NamedQuery(name = "TbUnidade.findBySgUnidade", query = "SELECT t FROM TbUnidade t WHERE t.sgUnidade = :sgUnidade"),
    @NamedQuery(name = "TbUnidade.findByEeEmail", query = "SELECT t FROM TbUnidade t WHERE t.eeEmail = :eeEmail")})
public class TbUnidade implements Serializable, Comparable<TbUnidade> {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idUnidade")
    private Integer idUnidade;
    
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 100)
    @Column(name = "nmUnidade")
    private String nmUnidade;
    
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 10)
    @Column(name = "sgUnidade")
    private String sgUnidade;
    
    @Size(max = 200)
    @Column(name = "eeEmail")
    private String eeEmail;
    
    @Basic(optional = true)
    @Size(min = 1, max = 1)
    @Column(name = "stRetornoOuvidoria")
    private String stRetornoOuvidoria;
    
    @Size(min = 1, max = 1)
    @Column(name = "stVinculada")
    private String stVinculada;
    
    @Size(min = 1, max = 1)
    @Column(name = "stEncaminharOutrasAreas")
    private String stEncaminharOutrasAreas;
   
    @OneToMany(mappedBy = "idUnidadeEnvio")
    private Collection<TbTramite> tbTramiteCollection  = new ArrayList<>();
    
    @OneToMany(mappedBy = "idUnidade")
    private Collection<TbUnidadexManifestacao> tbUnidadexManifestacaoCollection  = new ArrayList<>();
    
    @OneToMany(mappedBy = "idUnidade")
    private Collection<TbUsuario> tbUsuarioCollection = new ArrayList<>();
    
    @OneToMany(mappedBy = "idUnidadeRecebeu")
    private Collection<TbEncaminhamento> tbEncaminhamentoCollection  = new ArrayList<>();
    
    @OneToMany
    @JoinTable(
    		name="TbManifestacao_UnidadeAreaSolucionadora",
    		joinColumns={@JoinColumn(name="idUnidade", referencedColumnName="idUnidade")},
			inverseJoinColumns={@JoinColumn(name="idManifestacao", referencedColumnName="idManifestacao")})
    private Collection<TbManifestacao> tbManifestacaoCollection = new ArrayList<>();
    
    @OneToMany
    @JoinTable(
    		name="tbClassificacao_tbUnidade",
			joinColumns={@JoinColumn(name="tbUnidadeCollection_idUnidade", referencedColumnName="idUnidade")},
			inverseJoinColumns={@JoinColumn(name="TbClassificacao_idClassificacao", referencedColumnName="idClassificacao")})
    private Collection<TbClassificacao> tbClassificacaoCollection = new ArrayList<>();
    
    public TbUnidade() {
    }

    public TbUnidade(Integer idUnidade) {
        this.idUnidade = idUnidade;
    }

    public TbUnidade(Integer idUnidade, String nmUnidade, String sgUnidade) {
        this.idUnidade = idUnidade;
        this.nmUnidade = nmUnidade;
        this.sgUnidade = sgUnidade;
    }

    public Integer getIdUnidade() {
        return idUnidade;
    }

    public void setIdUnidade(Integer idUnidade) {
        this.idUnidade = idUnidade;
    }

    public String getNmUnidade() {
        return nmUnidade;
    }

    public void setNmUnidade(String nmUnidade) {
        this.nmUnidade = nmUnidade;
    }

    public String getSgUnidade() {
        return sgUnidade;
    }

    public void setSgUnidade(String sgUnidade) {
        this.sgUnidade = sgUnidade;
    }

    public String getEeEmail() {
        return eeEmail;
    }

    public void setEeEmail(String eeEmail) {
        this.eeEmail = eeEmail;
    }

    public Collection<TbTramite> getTbTramiteCollection() {
        return tbTramiteCollection;
    }

    public void setTbTramiteCollection(Collection<TbTramite> tbTramiteCollection) {
        this.tbTramiteCollection = tbTramiteCollection;
    }

    public Collection<TbUnidadexManifestacao> getTbUnidadexManifestacaoCollection() {
        return tbUnidadexManifestacaoCollection;
    }

    public void setTbUnidadexManifestacaoCollection(Collection<TbUnidadexManifestacao> tbUnidadexManifestacaoCollection) {
        this.tbUnidadexManifestacaoCollection = tbUnidadexManifestacaoCollection;
    }

    public Collection<TbManifestacao> getTbManifestacaoCollection() {
        return tbManifestacaoCollection;
    }

    public void setTbManifestacaoCollection(Collection<TbManifestacao> tbManifestacaoCollection) {
        this.tbManifestacaoCollection = tbManifestacaoCollection;
    }

    public Collection<TbUsuario> getTbUsuarioCollection() {
        return tbUsuarioCollection;
    }

    public void setTbUsuarioCollection(Collection<TbUsuario> tbUsuarioCollection) {
        this.tbUsuarioCollection = tbUsuarioCollection;
    }

    public Collection<TbEncaminhamento> getTbEncaminhamentoCollection() {
        return tbEncaminhamentoCollection;
    }

    public void setTbEncaminhamentoCollection(Collection<TbEncaminhamento> tbEncaminhamentoCollection) {
        this.tbEncaminhamentoCollection = tbEncaminhamentoCollection;
    }
    
    public Collection<TbClassificacao> getTbClassificacaoCollection() {
		return tbClassificacaoCollection;
	}

	public void setTbClassificacaoCollection(
			Collection<TbClassificacao> tbClassificacaoCollection) {
		this.tbClassificacaoCollection = tbClassificacaoCollection;
	}
	
    private String getEntidade() {
        return "Unidade";
    }

    private String getDescricao() {
        return nmUnidade;
    }
    
	public String getStRetornoOuvidoria() {
		return stRetornoOuvidoria;
	}

	public void setStRetornoOuvidoria(String stRetornoOuvidoria) {
		this.stRetornoOuvidoria = stRetornoOuvidoria;
	}
	
	public boolean isRetornoOuvidoria() {
		return SIM.getId().equals(stRetornoOuvidoria);
	}
	
	public void setRetornoOuvidoria(boolean data) {
		this.stRetornoOuvidoria = data ? SIM.getId() : NAO.getId();
	}
	
	public String getStVinculada() {
		return stVinculada;
	}
	
	public void setStVinculada(String stVinculada) {
		this.stVinculada = stVinculada;
	}
	
	public boolean isVinculada() {
		return SIM.getId().equals(stVinculada);
	}
	
	public void setVinculada(boolean data) {
		this.stVinculada = data ? SIM.getId() : NAO.getId();
	}
	
	public String getStEncaminharOutrasAreas() {
		return stEncaminharOutrasAreas;
	}
	
	public void setStEncaminharOutrasAreas(String stEncaminharOutrasAreas) {
		this.stEncaminharOutrasAreas = stEncaminharOutrasAreas;
	}
	
	public boolean isEncaminharOutrasAreas() {
		return SIM.getId().equals(stEncaminharOutrasAreas);
	}
	
	public void setEncaminharOutrasAreas(boolean data) {
		this.stEncaminharOutrasAreas = data ? SIM.getId() : NAO.getId();
	}
	
	@Override
	public int hashCode() {
		int hash = 0;
		hash += (idUnidade != null ? idUnidade.hashCode() : 0);
		return hash;
	}
	
	@Override
	public boolean equals(Object object) {
		if (!(object instanceof TbUnidade)) {
			return false;
		}
		TbUnidade other = (TbUnidade) object;
		if ((this.idUnidade == null && other.idUnidade != null)
				|| (this.idUnidade != null && !this.idUnidade
				.equals(other.idUnidade))) {
			return false;
		}
		return true;
	}
	
	@Override
	public String toString() {
		return String.format("%s > %s", getEntidade(), getDescricao());
	}
	
	@Override
	public int compareTo(TbUnidade o) {
		return getNmUnidade().toUpperCase().compareTo(o.getNmUnidade().toUpperCase());
	}
	
	public String getNomeFormatado() {
		String name = null;
		if(getIdUnidade() == UnidadeEnum.OUVIDORIA.getId()) {
			name = "Ouvidoria";
		} else {
			name = String.format("%s - %s", getSgUnidade(), getNmUnidade());
		}
		return name;
	}
    
}