Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Lazy quebrando aplicação ao chamar atributo da classe relacionada - Eager não quebra

Fala pessoal!

Estou tomando a maior surra, estou a horas e horas e de verdade não entendo o que estou fazendo de errado.

Tenho uma classe User que possui uma relação com o Profile (muitos para um), ou seja, um User precisa de ter um Profile e automaticamente um Profile pode ter vários Users.

Tudo funciona perfeitamente até um precisar acessar alguma informação do Profile partindo do User, tanto no spring quando no próprio Sysout a aplicação quebra retornando o famoso erro do lazy.

Se eu mudo o FetchType pra Eager ele não quebra, porém fica consultando os dados da Profile a todo momento ( que é a sua função) mas eu quero realmente usar o recurso da Lazy de consultar somente que eu chamar.

Segue o erro:

Sun Nov 07 03:33:18 BRT 2021
There was an unexpected error (type=Internal Server Error, status=500).
could not initialize proxy [br.com.occhi.model.Profile#1] - no Session
org.hibernate.LazyInitializationException: could not initialize proxy [br.com.occhi.model.Profile#1] - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:170)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:310)
    at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyInterceptor.java:45)
    at org.hibernate.proxy.ProxyConfiguration$InterceptorDispatcher.intercept(ProxyConfiguration.java:95)

Meu modelo User

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @NotBlank
    private String nome;

    @NotNull
    @NotBlank
    private String email;

    @NotNull
    @NotBlank
    private String senha;

    @ManyToOne(fetch = FetchType.LAZY)
    private Profile profile;

    /*Getters and Setters*/

}

Meu modelo Profile

@Entity
@Table(name = "profiles")
public class Profile{

    public Profile(){
    }

    public Profile(Integer id) {
        this.id = id;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Size(min=5, max=20)
    private String nome;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "profile", fetch = FetchType.LAZY)
    private List<User> users;

    /*Getters and Setters*/

}

Se eu chamar na view do Thymeleaf com essa linha já era:

<td th:text="${user.profile.nome}"> profile</td>
1 resposta
solução!

Sei lá, apaguei e comecei tudo novamente. Agora foi. Fechando o tópico.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software