[RESOLVIDO] Hibernate - failed to lazily initialize a collection of role

Olá galera, tudo bem?

Estou tentando resolver este problema mas não estou conseguindo evoluir com as pesquisas que tenho feito. Meu cenário é o seguinte:

Tenho uma classe chamada Plano. Ela possui muitas Ações e muitas Interações. Por isso as coloquei em uma List. Segue o modelo dela:

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import javax.persistence.*;
import java.util.Calendar;
import java.util.List;

@Entity
@Table(name = "Plano")
@TableGenerator(
        name = "PLANO_GEN",
        table = "PLANO_ID",
        pkColumnName = "ID",
        pkColumnValue = "PLANO",
        valueColumnName = "VALOR",
        allocationSize = 1
)
public class Plano {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "PLANO_GEN")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "id_representante")
    private Representante representante;

    @ManyToOne
    @JoinColumn(name = "id_conta")
    private Conta conta;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_plano")
    private List<Acao> acoes;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "id_plano")
    private List<Interacao> interacoes;


}

Cada plano está ligado a uma Conta e a um Representante.

Eu gostaria de realizar um consulta, listando o plano cadastrado. O resultado deveria trazer os dados do Plano e os dados das relações de Conta, Representante, Ações e Interações. Este é o meu método Dao:

import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import java.util.ArrayList;
import java.util.List;

@Repository
public class PlanoDao {

    public List<Plano> planos() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("Plano");
        EntityManager manager = factory.createEntityManager();

        List<Plano> planos = manager.createQuery("select p from Plano as p join fetch p.acoes join fetch p.interacoes").getResultList();

        manager.close();
        factory.close();

        return planos;
    }
}

Ao executá-lo obtenho o erro:
cannot simultaneously fetch multiple bags:

Ao retirar a palavra fetch da consulta obtenho o erro:
failed to lazily initialize a collection of role

Por favor, poderiam me ajudar com este caso?

Valeu!

A mensagem de erro é clássica, o hibernate não consegue gerenciar mais de um atributo como lazy.
Existem várias threads (como esta) relatando o problema e apresentando a solução.

Olá Darlan. Obrigado pela ajuda. Para contextualizar, segue o problema e a solução que implementei:

problema: “A especificação JPA não permite que em uma classe do tipo bean de entidade sejam utilizados dois relacionamentos com fetch igual a FetchType.EAGER, sendo esses do tipo das interfaces List e Collection. Assim, para contornar essa limitação definimos um dos relacionamentos como um objeto do tipo da interface Set.” - resposta postada pelo @illa_Silva_Barros

solução: eu fiz a seguinte alteração na classe Plano:

public class Plano {

	... ocultei atributos ...


@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "id_plano")
private List<Acao> acoes;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "id_plano")
private Set<Interacao> interacoes;


	... ocultei atributos ...

}

Mudei de List para Set no atributo interacoes, inclui fetch = FetchType.EAGER na anotação OneToMany. Na classe PlanoDao meu select ficou assim:

List<PlanoTatico> planos = manager.createQuery("select p from PlanoTatico as p join fetch p.acoes join p.interacoes ").getResultList();
1 curtida