Ray da Costa

« Enviar email via EJB | Home | Retirar linha do JTable »

Failed to lazily initialize a collection of role [EJB]

de raydacosta | Quarta, 8 de Outubro de 2008

[LazyInitializationException] failed to lazily initialize a collection of role: ejb.entity.TermSource.termProjs, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ejb.entity.TermSource.termProjs, no session or session was closed

Recebi o error ao tentar incluir um determinado objeto no BD. Procurei uma solução possivel e não encontrei. Achei um site onde os kras também tem o mesmo problema e falam de algumas soluções paliativas aqui. Em particular eu resolvi este problema carregando o objeto separadamente do pai, ou seja, carrego a pessoa e depois carrego o endereco passando o id para o metodo findById().

Pelo que entendi o Lazy nao carrega as colections dos filhos assim vc tem q carregar na mao mesmo.

Categorias: EJB |  | Enviar por e-mail  | Hits para esta publicação: 1354

5 comentários para “ Failed to lazily initialize a collection of role [EJB] ”

  1. raydacosta Says:
    Segunda, 18 de Maio de 2009 at 17:36

    Olha resolvi este problema colocando todo os metodos com FetchType.EAGER, ou seja, sempre que necessário usar FetchType, uso EAGER.

    Ex:
    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER)
    @Fetch(FetchMode.SUBSELECT)
    private List crawlFilters;

  2. raydacosta Says:
    Segunda, 18 de Maio de 2009 at 17:40

    Aaaaaaa au usar o List como collection de minhas entidades (Entity) recebi a exception do tipo Bag, para resolver coloquei todos os List’s como Set, ai o problema foi resolvido.

  3. Aline Says:
    Domingo, 20 de Setembro de 2009 at 20:41

    Raydacosta, muito obrigada por explicar sobre o prob lema do FetchType. Eu tava quebrando a cabeça aqui o dia inteiro achando que era algum erro com a sessão, sem pensar na possibilidade de ser com os relacionamentos! Obrigada mesmo! =)

  4. Janira Says:
    Segunda, 16 de Novembro de 2009 at 09:43

    Estou desenvolvendo uma aplicação web utilizando como estrutura:
    Struts, Spring 2, Jpa e Hibernate e estou com o mesmo problema :
    ” d [org.hibernate.LazyInitializationException] - failed to lazily
    initialize a collection of role:
    br.com.bry.curriculos.pojo.Pessoa.enderecos, no session or session was closed org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.bry.curriculos.pojo.Pessoa.enderecos, no
    session or session was closed at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)”

    E eu tenho uma entidade PESSOA que possui uma lista de ENDERECOS em
    alguns fóruns falam que necessita outros não.. e como nas duas formas
    colocando ou nao o Fetch.EAGER na classe PESSOA acontece o mesmo erro..

    ===========Pojo de Pessoa
    @OneToMany(mappedBy = “pessoa”, targetEntity = Endereco.class, cascade
    = CascadeType.ALL,fetch = FetchType.EAGER)
    private List enderecos;

    public List getEnderecos() {
    return enderecos;
    }

    public void setEnderecos(List enderecos) {
    this.enderecos = enderecos;
    }
    ===========Pojo de Endereco
    @ManyToOne(targetEntity=Pessoa.class)
    @JoinColumn(name=”ID_PESSOA” , nullable=false)
    private Pessoa pessoa;

    public Pessoa getPessoa() {
    return pessoa;
    }
    public void setPessoa(Pessoa pessoa) {
    this.pessoa = pessoa;
    }

    No arquivo de configuracao do meu web .xml eu utilizo o filter “org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter” …

    Gostaria de saber se vc já passou por isso..

  5. raydacosta Says:
    Terça, 17 de Novembro de 2009 at 23:51

    Puts, nao uso Struts, Spring 2, mas tive realmente problemas semelhantes, uma alternativa foi Usar no lugar da collection usar Set este resolveu o problema por completo, nao sei se é bug ou forma de usar, mas resolveu.. Outra coisa, nao usei muit das anotações nao, meu dá maior rolo… use o minimo…Maximo que usei: @ManyToOne

Deixe uma resposta.