1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Lazy-loading com OneToMany

Ola.

Estou com dificuldades em fazer funcionar os meus relacionamentos fetch = FetchType.LAZY com a anotação @OneToMany. Na minha entidade NotaFiscal, há várias listas fetch = FetchType.LAZY, ao fazer o load do objeto pelo id, carrego todas estas listas com left outer join. Em primeira instância (depurando) todas as listas são carregadas. Porem, no momento em que eu troco de aba e é feita a requisição da lista de emails (listaEmail) está me retornando o erro:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.inf.criare.erp.nota.domain.NotaFiscal.listaEmail, could not initialize proxy - no Session

Para tentar explicar melhor, segue parte da classe NotaFiscal

@Entity
@Table(name = "notas_fiscais")
public class NotaFiscal implements IEntity {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@OneToMany(mappedBy = "notaFiscal", fetch = FetchType.LAZY,
        cascade = {CascadeType.ALL},
        orphanRemoval = true)
private List<NotaFiscalItem> itens;

@OneToMany(mappedBy = "notaFiscal", fetch = FetchType.LAZY,
        cascade = {CascadeType.ALL},
        orphanRemoval = true)
private List<NotaFiscalDocRef> listaDocRef;

@OneToMany(mappedBy = "notaFiscal", fetch = FetchType.LAZY,
        cascade = {CascadeType.ALL},
        orphanRemoval = true)
private List<NotaFiscalProcRef> listaProcRef;

//-----------------------------------------------------
//GRUPO DE CAMPO DE USO LIVRE
//----------------------------------------------------- 
@OneToMany(mappedBy = "notaFiscal", fetch = FetchType.LAZY,
        cascade = {javax.persistence.CascadeType.ALL},
        orphanRemoval = true)
private List<NotaFiscalObsCont> listaObsCont;

@OneToMany(mappedBy = "notaFiscal", fetch = FetchType.LAZY,
        orphanRemoval = true,
        cascade = {CascadeType.ALL})
private List<NotaFiscalVeiculo> veiculos;

@OneToMany(mappedBy = "notaFiscal", fetch = FetchType.LAZY,
        orphanRemoval = true,
        cascade = {CascadeType.ALL})
private List<NotaFiscalVolumes> volumes;

@OneToMany(mappedBy = "notaFiscal", fetch = FetchType.LAZY,
        cascade = {CascadeType.ALL},
        orphanRemoval = true)
private List<NotaFiscalEvento> eventos;

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "notas_fiscais_email", joinColumns=@JoinColumn(name="nota_fiscal_id"))
private List<NotaFiscalEmail> listaEmail;

@ElementCollection(fetch = FetchType.LAZY)
@Column(name = "documento", length = 20, nullable = false)
@CollectionTable(name = "notas_fiscais_autxml", joinColumns=@JoinColumn(name="nota_fiscal_id"))
private List<String> listaAutXml;

Método que faz o load pelo id:

private NotaFiscal loadLazy(Long id) {
    try {
        String sql = "select o from NotaFiscal as o "
                + "left outer join o.listaEmail le "
                + "left outer join o.listaAutXml la "
                + "left outer join o.pagamentos p "
                + "left outer join o.duplicatas du "
                + "left outer join o.itens i "
                + "left outer join o.listaDocRef ldr "
                + "left outer join o.listaProcRef lpr "
                + "left outer join o.listaObsCont obs "
                + "left outer join o.eventos eve "
                + "left outer join o.volumes volumes "
                + "left outer join o.veiculos vei "
                + "where o.id = :id ";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", id);

        return (NotaFiscal) query.getSingleResult();
    } catch (Exception e) {
        CriareLog.log(e);
        return null;
    }
}

Método em que acontece o erro no momento da requisição da lista.

public DataModel<NotaFiscalEmail> getEmailsDM() {
    if (emailsDM == null) {
        if (this.getBean().getListaEmail() == null) {
            this.getBean().setListaEmail(new ArrayList<NotaFiscalEmail>());
        }
        // O erro ocorre exatamente nesta linha.
        emailsDM = new ListDataModel<NotaFiscalEmail>(this.getBean().getListaEmail()); 
    }
    return emailsDM;
}

Se precisar de mais alguma coisa vai falando que eu vou postando aqui. Agradeço a ajuda de todos. Abraços

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java lazy hibernate jsf ou faça a sua própria pergunta.