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

LazyInitializationException

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.alura.spring.data.orm.Cargo.funcionario, could not initialize proxy - no Session

Estou com esse problema, seguindo a aula de DerivedQuery não consegui encontrar o problema, o erro acontece quando acesso a aba de relatórios e tento buscar por um nome ele da esse erro, comparei meu código com o da aula mas não achei o problema... Segue abaixo os códigos: Classe de Cargo

@Entity
@Table(name="cargos")
@Getter
@Setter
@ToString
public class Cargo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String descricao;
    @OneToMany(mappedBy = "cargo")
    private List<Funcionario> funcionario;
}

Classe de Funcionário

package br.com.alura.spring.data.orm;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import javax.persistence.*;
import java.time.LocalDate;
import java.util.List;

@Entity
@Table(name="funcionarios")
@Getter
@Setter
@ToString
public class Funcionario {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String nome;

    private String cpf;

    private Double salario;

    private LocalDate dataContratacao;

    @ManyToOne
    @JoinColumn(name = "cargo_id", nullable = false)
    private Cargo cargo;

    @Fetch(FetchMode.SELECT)
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "funcionarios_unidades", joinColumns = {
            @JoinColumn(name = "fk_funcionario")},
    inverseJoinColumns = { @JoinColumn(name = "fk_unidade")})
    private List<UnidadeTrabalho> unidadeTrabalhos;
}

Referente a service RelatoriosService criada:

package br.com.alura.spring.data.service;

import br.com.alura.spring.data.orm.Funcionario;
import br.com.alura.spring.data.repository.FuncionarioRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Scanner;

@Service
public class RelatoriosService {
    private Boolean system = true;

    private final FuncionarioRepository funcionarioRepository;

    public RelatoriosService(FuncionarioRepository funcionarioRepository){
        this.funcionarioRepository = funcionarioRepository;
    }

    public void inicial(Scanner scanner){
        while(system){
            System.out.println("Qual ação de cargo deseja executar");
            System.out.println("0 - Sair");
            System.out.println("1-  Busca funcionário pelo nome");

            int action = scanner.nextInt();
            switch(action){
                case 1:
                    buscaFuncionario(scanner);
                    break;
                default:
                    system = false;
                    break;
            }

        }
    }

    private void buscaFuncionario(Scanner scanner){
        System.out.println("Qual nome deseja pesquisar: ");
        String nome = scanner.next();
        List<Funcionario> list = funcionarioRepository.findByNome(nome);
        list.forEach(System.out::println);
    }
}
3 respostas

Opa! Toda vez que lançar uma LazyException, significa que a relação entre os objetos ainda não foi concluída para retornar.

Então, os cargos do funcionário ainda não estão prontos. A consulta fechou antes de retornar, ou não estava aberta. E ainda é um relacionamento bidirecional, talvez colocar EAGER no funcionários do cargo possa resolver.

Mas é importante entender a situação, ela se repete com frequência.

Acho que resolveu em parte o problema, o que eu percebo é que todas as consultas usando visualizar estão dando erro e não consegui encontrar o problema

solução!

No meu caso o problema estava com dois problemas sendo um no método ToString e o (devido ao fato)fato de eu estar usando o Lombok...

@Override
    public String toString() {
        return "Funcionario: " + "id:" + id + "| nome:'" + nome + "| cpf:" + cpf + "| salario:" + salario
                + "| dataContratacao:" + dataContratacao + "| cargo:" + cargo.getDescricao();
    }

Também adicionei o Eager na classe de Cargo

@OneToMany(mappedBy = "cargo", fetch = FetchType.EAGER)
    private List<Funcionario> funcionario;